Autor Beitrag
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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)
user defined image
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Mo 22.03.04 21:49 
hehe, kleiner denkfehler deinerseits:

ausblenden 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:
members.aol.com/Horschdware/FarbenV2.rar

_________________
Delphi: XE - OS: Windows 7 Professional x64
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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)