Autor |
Beitrag |
Horschdware
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Mo 22.03.04 19:06
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....
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: 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?
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
Zuletzt bearbeitet von MathiasH am Mo 22.03.04 19:24, insgesamt 1-mal bearbeitet
|
|
Horschdware 
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Mo 22.03.04 19:23
Hmm... Assembler kann ich nicht wirklich (also, gar nicht um es genauer zu sagen)
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; |
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: 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]
_________________ "Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
|
|
Horschdware 
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: 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
nochn edit:
hier mal zum reinschaun was ich da überhaupt mache:
members.aol.com/Horschdware/FarbenV2.rar
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Di 23.03.04 16:34
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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
|