Wie berechnet sich der Spiegel Punkt entlang einer Linie?
In der 2D-Ebene, ich habe einen Punkt und eine Linie. Wie man die Spiegel Punkt entlang dieser Linie?
Ich glaube, dies ist der falsche Ort für diese Frage, da es sich nicht direkt mit der Programmierung. Es ist eine andere Website: math.stackexchange.com
Wie ist Ihre Linie definiert? (Ich nehme an, Ihr Punkt ist definiert durch die x,y Koordinaten ein.)
Linie definiert ist, die mit zwei Punkten oder mit 1 Punkt und 1 Vektor.
Haben Sie versucht, die wikipedia?
hat wiki die Antwort auf diese Frage?
Wie ist Ihre Linie definiert? (Ich nehme an, Ihr Punkt ist definiert durch die x,y Koordinaten ein.)
Linie definiert ist, die mit zwei Punkten oder mit 1 Punkt und 1 Vektor.
Haben Sie versucht, die wikipedia?
hat wiki die Antwort auf diese Frage?
InformationsquelleAutor Adam Lee | 2012-01-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nehmen wir an, die Gleichung der Zeile ist
ax + by + c = 0
. Nun stellen Sie sich eine Linie senkrecht dazu, die dargestellt werden kann durch-bx + ay + d = 0
(Produkt der Steigungen zweier senkrechter geraden ist -1). Das problem ist jetzt zu findend
. Legen Sie die co-ordinate des Punktes auf der zweiten Zeile, und Sie erhalten die Wertd
leicht.Der zweite Teil ist, finden Sie einen Punkt auf die zweite Linie, die gleich weit wie der erste Punkt der ersten Linie. Für das, finden Sie den Schnittpunkt der beiden Linien. Die Berechnung der Unterschiede in
x
undy
von dem gegebenen Punkt und dem Schnittpunkt. Nun fügen Sie diese in diex
undy
Wert für den Schnittpunkt. Das gibt den Punkt, den Sie benötigen (Sie müssen möglicherweise zu negieren der Unterschiede - das ist bis auf die Reihenfolge der Subtraktion).InformationsquelleAutor 0605002
Wenn Dinge wie, dass in computer-Programme, eines der Themen, die Sie vielleicht zu tun haben, ist die Durchführung dieser Berechnungen mit integer-Arithmetik nur (oder soviel wie möglich), vorausgesetzt, die Eingabe in ganzen zahlen. Dies zu tun, in ganzen zahlen, so viel wie möglich, ist eine separate Frage, die ich nicht abdecken hier.
Folgende ist eine "mathematische" Lösung, die umgesetzt werden, wenn buchstäblich benötigen floating-point-Berechnungen. Ich weiß nicht, ob dies akzeptabel ist, in Ihrem Fall. Optimieren Sie es nach Ihrem Geschmack selbst.
(1) Vertreten Ihre Linie
L
durchGleichung. Beachten Sie, dass Vektor
(A, B)
ist der Normalenvektor dieser Linie.Zum Beispiel, wenn die Linie wird durch zwei Punkte definiert
X1(x1, y1)
undX2(x2, y2)
, dann(2) Normalisieren die Gleichung durch Division aller Koeffizienten, die durch die Länge des Vektors
(A, B)
. I. e. berechnen Sie die Längeund dann die Werte berechnen
Die Gleichung
ist noch eine äquivalente Gleichung der Linie
L
außer, dass jetzt der Normalenvektor(A', B')
ist ein Einheitsvektor.(3) Nehmen Sie Ihre Punkt
P(px, py)
und berechnen Sie den WertDies gibt Ihnen die unterzeichnet Entfernung
D
aus Ihrer SichtP
Ihrer LinieL
. In anderen Worten, dies ist der Abstand vonP
zu dem nächsten Punkt aufL
(die wir nicht wirklich über den nächsten Punkt selbst, wir müssen nur den Abstand).Sagt die Zeichen, die Seite der Linie
L
den PunktP
liegt. WennP
liegt auf der gleichen Seite der Vektor(A', B')
verweist ("positiv" - Seite), ist der Abstand positiv ist. WennP
liegt auf der anderen Seite ("negativ" - Seite), ist der Abstand negativ.(4), um zu finden, Ihre Spiegel zeigen
P'(px', py')
Sie brauchen, um Ihren PunktP
durch die absolute Distanz|2 * D|
über die LinieL
auf die andere Seite."Across the line" wirklich bedeutet, dass, wenn der Punkt
P
lag auf der "positiven" Seite derL
, dann haben wir ihn zu bewegen, gegen die Richtung des Vektors(A', B')
auf die "negative" Seite. Und Umgekehrt, wenn der PunktP
lag auf der "negativen" Seite derL
, dann müssen wir es verschieben in Richtung des Vektors(A', B')
auf die "positive" Seite.Diese können einfach ausgedrückt werden als verschieben des Punktes die Entfernung von
-2 * D
(beachten Sie das Minuszeichen) in Richtung des Vektors(A', B')
.Das bedeutet, dass
gibt Ihnen Ihre Spiegel zeigen
P'(px', py')
.Alternativ können Sie verwenden einen Ansatz, der auf die Feststellung der tatsächlichen am nächsten Punkt
N
on lineL
und dann was den PunktP
mit Bezug aufN
. Dies ist schon in anderen Antworten, werde ich nur beschreiben, wie ich es tun würde.(1) eine Formel Erstellen
für Ihre Linie
L
genau wie in Schritt 1 beschrieben vor. Es gibt keine Notwendigkeit zu normalisieren dieser Gleichung.(2) Bauen Sie eine Gleichung für die senkrechte Linie, die durchläuft
P
. Lassen Sie uns sagen, dass die senkrechte Linie ist vertreten durchDen
D
undE
Koeffizienten bekannt sind, sofortwährend
F
berechnet werden kann durch ersetzen des PunktesP
in die Gleichung(3) Finden, den Schnittpunkt dieser beiden Linien durch die Lösung des Systems von zwei linearen Gleichungen
Cramer ' s rule funktioniert sehr gut in diesem Fall. Die angegebene Formel in Line Kreuzung Artikel in der Wikipedia sind nichts anderes als eine Anwendung von cramers Regel zu diesem system.
Die Lösung bietet Ihnen den am nächsten gelegenen Punkt
N(nx, ny)
wir waren auf der Suche für.(4) Jetzt einfach berechnen
finden Sie Ihre Punkt
P'(px', py')
.Beachten Sie, dass dieser Ansatz fast vollständig umgesetzt in zahlen. Der einzige Schritt, der möglicherweise verlieren Präzision ist die division innerhalb der Cramer-Regel, die bei Schritt 3. Natürlich, wie üblich, der Preis, den Sie zu bezahlen haben, für "fast integral" - Lösung ist die Notwendigkeit für große-zahlen-Arithmetik. Auch Koeffizienten
C
undF
können überlaufen, auch nicht zu erwähnen, Berechnungen innerhalb Cramer ' s Regel-Formeln.Ich Stimme mit @badweasel. Dieser sollte gekennzeichnet werden, wie die richtige Antwort.
InformationsquelleAutor AnT
Die details hängen davon ab, wie deine Linie vertreten. Wenn Sie darstellen, wie Sie einen beliebigen Punkt P auf der Linie zusammen mit einer Einheit Spalten-Vektor n entlang der Linie, dann wird der Spiegel Punkt Q' zu jedem Punkt Q ist gegeben durch:
(Hier ist I die 2x2-Einheitsmatrix, nT ist die transponierte von n (Behandlung von n als eine 2x1-matrix), und nnT ist die 2x2 matrix gebildet, die von standard-matrix-Multiplikation von n mit nT.) Es ist nicht allzu schwer zu zeigen, dass Q' wird sich nicht ändern, wenn Sie verschieben P überall auf der Linie.
Es ist nicht schwer zu konvertieren anderen liniendarstellungen in einem Punkt/Einheit Vektor-Darstellung.
InformationsquelleAutor Ted Hopp
Berechne den nächsten Punkt auf der Linie zu dem Punkt in Frage. Dann kehren Sie die Richtung des Vektors zwischen diesen Punkten und fügen Sie es zu dem nächsten Punkt auf der Linie. Voilà, Sie haben gefunden, dass der Spiegel zeigen.
Mit math: paulbourke.net/geometry/pointline oder versuchen Sie google: google.com/...
InformationsquelleAutor Anteru
Ich nehme an, Sie haben die Position des Punktes, und eine Gleichung für die Linie, d.h.
Zuerst zu den offensichtlichen Fall, wo a=0 (d.h. eine Linie parallel zur x-Achse) ergibt
Für den allgemeineren Fall,
Holen Sie die generische Gleichung für eine Linie orthogonal zu verkaufen: y = cx + d, mit ac = -1
==> c = -1/a
Bestimmen Sie b, so dass P gehört zu den orthogonalen Linie: y1 = -x1/a + d
==> d = y1 + x1/a
Holen Sie sich die Kreuzung zwischen zwei Linien: y = -x/a + y1 + x1/= ax + b
==> x = (y1 + x1/a-b)/(a+1/a), y = (y1 + x1/a-b)/(a+1/a) + b
Erhalten den Vektor zwischen Schnittpunkt und deinem Punkt P, hinzufügen, dass, um den Schnittpunkt zu erhalten, der Spiegel Punkt P'.
==> P'(x2,y2), mit
x2 = x1 + 2((y1 + x1/a-b)/(a+1/a) - x1)
y2 = y1 + 2(a(y1 + x1/a-b)/(a+1/a) + b - y1)
Einige Schritte vereinfacht werden können, aber dies ist die Allgemeine Idee. Ich habe die algebra während der Eingabe, so könnte es sein Fehler. Wenn Sie eine finden, lassen Sie es mich bitte wissen.
x = constant
) und es wird Probleme für die fast senkrechten Linien. Starten Sie mit einer impliziten Gleichung (ax + by + c = 0
).Richtig, diese Lösung ist nicht allgemein genug.
InformationsquelleAutor Karolos
Habe ich gemacht, genau dies für ein anderes system, das ich gebaut habe.. Es ist viel mehr als das in meinem code; also ich hoffe, ich habe extrahiert alle notwendigen bits...
Line.ClosestPoint(Point pt)
ist die Methode, die Sie wollen...Der Algorithmus basiert auf der Idee, dass die Steigung der Linie perpindicular für jede gegebene Zeile wird die negative multiplikative Kehrwert der Steigung der gegebenen Linie. d.h., wenn eine Linie hat die Steigung m, dann die andere Linie hat die Steigung -1/m. So alle Sie tun müssen ist, bilden eine Linie durch den Punkt mit Steigung gleich -1/m und finden Sie den Schnittpunkt dieser Linie mit der ursprünglichen Linie.
InformationsquelleAutor Charles Bretana