Punkt auf Rechteckrand
-
Zwar brauch ich das für ein Programm, aber ist doch mehr Mathematik, also sollte die Frage hier richtig platziert sein.
Also, ich hab folgendes Problem: Ein Rechteck ist gegeben, außerdem dessen Mittelpunkt M und ein weiterer Punkt P (der beliebig, also auch evtl. im Rechteck liegt). Gesucht ist der Punkt Q, der auf der Verbindungsgeraden liegt, die von M und P gebildet wird. Das ganze ist nur 2 dimensional.
Q x P -------x-- | x M | ----------
Sprich, ich benötige den Punkt, der sicher ergibt, wenn man den Vektor MP (Angriffspunkt M) mit dem Rechteck schneiden lässt.
Ich habe versucht dem ganzen mit Trigonometrie beizukommen, aber das ist extrem umständlich (oder ich habe was übersehen). Der Grund hierfür ist, dass ich unterscheiden muss, wo der Punkt P liegt: Oben, unten, rechts, links oder im Rechteck. Und je nachdem dann andere Werte als gegeben ansehen. Z.B. wenn der Punkt Oberhalb liegt, dann habe ich den y-Wert von Q (weil das einfach die kürzeste, also senkrechte Strecke zwischem M und der oberen Seite des Rechtecks ist). Dann kann ich per Trigo den fehlenden x-Wert berechnen.
Gibt es da keine bessere, bzw. eine allgemeinere Lösung, so dass ich die Lösung ohne Fallunterscheidung erhalte?
-
Gugi schrieb:
Gibt es da keine bessere, bzw. eine allgemeinere Lösung, so dass ich die Lösung ohne Fallunterscheidung erhalte?
du brauchst keine Trigonometrie, Ähnlichkeitsüberlegungen reichen aus. Und im einfachsten Fall hast du eine Unterscheidung, ob Q auf einem horizontalen oder vertikalen Abschnitt liegt. Zwischen links/rechts bzw. oben/unten kannst du z.B. mit Hilfe der Signum-Funktion auswählen.
-
Gugi schrieb:
Gibt es da keine bessere, bzw. eine allgemeinere Lösung, so dass ich die Lösung ohne Fallunterscheidung erhalte?
du brauchst keine Trigonometrie, Ähnlichkeitsüberlegungen reichen aus. Und im einfachsten Fall hast du eine Unterscheidung, ob Q auf einem horizontalen oder vertikalen Abschnitt liegt. Zwischen links/rechts bzw. oben/unten kannst du z.B. mit Hilfe der Signum-Funktion auswählen.
-
ohne fallunterscheidung geht das sicher nicht, aber über trigonometrie wäre
das zu aufwändig. bilde einfach einen verbindungsvektor V zwischen P und M.(fehlerabfrage durch null lasse ich mal weg)
(min = minimum)V = P - M
länge = betrag(min(breite / 2 / V.x, höhe / 2 / V.y))
Q = M + länge * V
man berechnet zuerst den faktor für die länge, dann setzt man den faktor ein
edit: eine nullsichere abfrage sähe so aus
länge = 1 / betrag(max(V.x / (breite / 2), V.y / (höhe / 2)))
vorraussetzung ist P != M
-
Mh, ich nehme an, dass du mit "min" eine Funktion meinst, die den kleineren der beiden Werte zurückgibt? (Also nicht das Minium bei Funktionen wie f(x)=x^2)
Aber dann versteh ich die Formel überhaupt nicht, und in sie funktioniert z.B. auch nicht, wenn P sich rechts unten befindet, so dass Q im unteren Teil des rechten Randes des Rechtecks läge. Als Ergebnis kommt da etwas raus, das überhaupt nicht auf der Rand liegt.
Wie kommst du auf die Formel?
-
ja min bedeutet einfach nur der kleinere der beiden werte
breite / 2 ist der abstand des rechten randes von der mitte M
teilt man Vx also die x-komponente des verbindungsvektors durch diesen
wert, erhällt man die länge des vektors im verhältniss zur entfernung
zum rand (nur x-komponente)das selbe macht man für die y-komponente
von beiden werten nimmt man den betrag
mein fehler war nun den größeren der beiden zu nehmen. eigentlich muss man
den nehmen, der näher an der 1 liegt. nennen wir diesen wert S. wenn man den
verbindungsvektor V durch S teil, ist die länge einer
komponete demnach 1. also auf dem rand. da der vektor V relativ zum mittelpunkt
M ist, addieren wir diesen.bsp.
rechteck
xmin = 5
xmax = 10
ymin = 5
ymax = 10=> breite = 5
=> höhe = 5
=> M = (7.5 / 7.5)p = (8 / 4) außerhalb des rechtecks
V ist demnach P - M = (0.5 / -3.5)
sx = Vx / (breite / 2) = 0.5 / 2.5 = 0.2 (betrag = 0.2)
sy = Vy / (höhe / 2) = -3.5 / 2.5 = -1.4 (betrag = 1.4)=> betrag von sy ist näher an 1 (ka wie die mathematische ausdruck dafür ist)
V / sy = (0.5 / -3.5) / 1.4 = (0.357.... / -2.5)
Q = M + V = (7.5 / 7.5) + (0.357... / -2.5) = (7.857 / 5)
der punkt liegt auf dem rechteck und zwar rechts unten
-
Mh, hört sich gut an. Ich denk das später nochmal durch, danke aufjedenfall
Ich habs nach deinem (vorherigen) Post folgendermaßen gelöst:
1. Verhältnisse berechnen:
- Rechteck: Breite / Höhe
- Vektor: x / y
Die beiden dann vergleichen. Wenn das Verhältniss des Rechtecks größer ist als das andere, dann wird der Punkt oben bzw. unten auf dem Rechteck liegen, ansonsten links oder rechts. (Gleichheit dann halt Ecke).2. Die Punkte der Zielseite hernehmen.
3. Ich habe dann zwei Geradengleichungen aufgestellt (aus den 2 Punkten des Rechtecks und aus dem Mittelpunkt und dem gegebenen Punkt). Diese lasse ich schneiden und bekomme dadurch den Parameter für eine der beiden Geraden, welche mir dann den Schnittpunkt liefert.
Ist wohl eindeutig komplexer als deines, aber es scheint korrekt zu sein.
-
Schau mal bei Wikipedia oder anderen nach:
Algorithmus von Cohen-Sutherland
Gruß,
Andreas