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)
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:


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