Testen ob eine Gerade einen Rechteck schneidet.
-
Kennt jemand ein effizientes Verfahren/Algo mit dem man testen kann ob eine Gerade einen rechteckigen Bereich schneidet? Die Gerade kann aber eine Rotation 0 - 360 Grad besitzen.
Wie sieht dann die Berechnung aus?
Danke im voraus.
-
-
probleme ergeben sich bei deiner beschreibung (@vertexwahn) wenn x1-x2 == 0 bzw. y1-y2 == 0. Dann steht 0 im Nenner und die Berechnung stimmtn icht mehr. Vielleicht könnte man das ganze auf die Parameterform der Geraden x=(x0/y0)+t(vx/vy) zurückführen und damit berechnen.
-
Maxi schrieb:
probleme ergeben sich bei deiner beschreibung (@vertexwahn) wenn x1-x2 == 0 bzw. y1-y2 == 0. Dann steht 0 im Nenner und die Berechnung stimmtn icht mehr. Vielleicht könnte man das ganze auf die Parameterform der Geraden x=(x0/y0)+t(vx/vy) zurückführen und damit berechnen.
abgesehen davon, das horizontale und vertikale Geradenstücke eh einfach geclippt werden können wird doch der Sonderfall behandelt:
// Testen ob Strecke horizontal? if(y2-y1==0) { xs = rect.left; ys = y1; // Höhe ändert sich nicht } ...
an den Stellen wo durch (x1-x2) getielt wird kann (x1-x2) nie 0 sein
-
z. B. hier:
else if(outcode & IS_LEFT_OF) // Links davon? { // Testen ob Strecke horizontal? if(y2-y1==0) { xs = rect.left; ys = y1; // Höhe ändert sich nicht } else { xs = rect.left; ys = y1 + (xs - x1) * (y2 - y1) / (x2 - x1); } }
hier wird durch x2-x1 geteilt - aber nur wenn ein Punkt links außerhalb des Rechtecks liegt und einer Innerhalb des Rechtecks - damit kann x2-x1 nicht 0 werden
vielleicht habe ich noch etwas übersehen - wenn ja gibt mir bitte an mit welchen Prametern du die Funktion bool CohenSutherland(int &x1, int &y1, int &x2, int &y2, const RectangleV &rect) aufrufst