Entwickler-Ecke
Multimedia / Grafik - Schnittmenge zweier Rechtecke
Horschdware - Mo 22.03.04 19:06
Titel: Schnittmenge zweier Rechtecke
High,
ich möchte gerne die Schnittmenge zweier Rechtecke herausbekommen. Ich habe das im Moment über eine if-Verschachtelung gelöst, die die Grenzen der Rechtecke zueinander abcheckt. Das funktioniert auch wunderbar, allerdings frage ichm ich, ob es da nicht eine praktischere Möglichkeit gibt das zu machen. Es gibt ja RectInRect (in DXClasses) aber das checkt nur, ob Rect1 komplett in Rect2 ist. Und ich will ja die Schnittmenge....
Delete - Mo 22.03.04 19:13
Mit SSE könntest du die Min/Max funktionen nutzen. Dafür müsstest du aber Assembler können.
Über die herkömmliche Sprache und die FPU gibt es meines Wissens keine bessere Möglichkeit.
MathiasH - Mo 22.03.04 19:23
was genau willst du denn?
eine Prüfung ob sie sich schneiden/berühren
die Schnittfläche
länge der Schnittkanten
und liegen die rechtecke so, dass ihre seiten parallel bzw orthogonal zueinander sind oder ist die Sache windschief?
Horschdware - Mo 22.03.04 19:23
Hmm... Assembler kann ich nicht wirklich (also, gar nicht um es genauer zu sagen) :wink:
edit:
ich will hier das schwarze Recheck rausfinden. (also, die dimensionen)
Bisher mach ichs so, dass ich abchecke, wo die Grenzen links, recht, oben, unten der anderen Rechtecke sind und daraus das schwarze Rechteck bastele. Ist aber etwas aufwändig und habe mir daher gedacht, dass es da doch auch was einfacheres geben muss.
nochn edit:
Im Moment mach ich das so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function IsRectInRect(rect1, rect2 : TRect) : boolean; begin if ((((rect1.left>=rect2.left)and(rect1.left<=rect2.right)) or ((rect1.left<=rect2.left)and(rect1.right>=rect2.left)) ) and ( ((rect1.top>=rect2.top)and(rect1.top<=rect2.bottom)) or ((rect1.top<=rect2.top)and(rect1.bottom>=rect2.top)) ) ) then Result:=true else Result:=false; end;
function FindNewRect(rect1, rect2 : TRect) : TRect; begin if rect1.left>rect2.left then Result.left:=rect1.left else Result.left:=rect2.left; if rect1.right>rect2.right then Result.right:=rect2.right else Result.right:=rect1.right; if rect1.top>rect2.top then Result.top:=rect1.top else Result.top:=rect2.top; if rect1.bottom>rect2.bottom then Result.bottom:=rect2.bottom else Result.bottom:=rect1.bottom; end; |
MathiasH - Mo 22.03.04 19:51
dann will ich mal ein bisschen Pseudocode produzieren(ich habe jedoch das gefühl, dass das genau das ist, was du bisher hast):
//Folgendes hat sich ja wohl erübrigt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| variablen r1: x1, y1, x2, y2 r2: x1, y1, x2, y2 rs: x1, y1, x2, y2 //schwarzes Rechteck
function isinside(point, rect): boolean result := false; if (point.x>rect.x1) and (point.x<rect.x2) and (point.y>rect.y1) and (point.y<rect.y2) then result := True;
//mainpart if isinside([r1.x1, r1.y1], r2) then rs.x1 := r1.x1; rs.y1 := r1.y1; //hier musst du noch herausfinden welches eck von r2 zu rs gehört und es an rs zuweisen end;
//entsprechend für die anderen 3 ecken von r1 |
Ich hoffe das hilft erstmal ein bisschen weiter
[edit]so wie ich das sehe ist dein code doch schön kompakt, viel besser als mein chaos - ich sollte mir mal überlegen einfacher zu denken...:) [/edit]
Horschdware - Mo 22.03.04 21:49
hehe, kleiner denkfehler deinerseits:
Delphi-Quelltext
1:
| if (point.x>rect.x1) and (point.x<rect.x2) and (point.y>rect.y1) and (point.y<rect.y2) then result := True; |
was machstn da wenn beide rechtecke genau deckungsgleich sind? ^^
und überhaupt: warum einfach, wenns auch kompliziert geht? *gggggggg*[/i]
also, wie es ausschaut sind meine funktionen da kompakt genug.
aber wegen dem "einfach denken": das kann ich auch nicht. keine angst, das ist normal :wink:
nochn edit:
hier mal zum reinschaun was ich da überhaupt mache:
http://members.aol.com/Horschdware/FarbenV2.rar
Keldorn - Di 23.03.04 16:34
Titel: Re: Schnittmenge zweier Rechtecke
Horschdware hat folgendes geschrieben: |
ich möchte gerne die Schnittmenge zweier Rechtecke herausbekommen. Ich habe das im Moment über eine if-Verschachtelung gelöst, die die Grenzen der Rechtecke zueinander abcheckt. Das funktioniert auch wunderbar, allerdings frage ichm ich, ob es da nicht eine praktischere Möglichkeit gibt das zu machen. |
Hast du dir schonmal Unionrect und
intersectRect in der OH angeschaut?
Mfg Frank
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!