2010-09-28 6 views
18

Ich möchte ein Stück eines Codes wissen, der mir sagen kann, ob 3 Punkte in einem 2D-Raum auf der gleichen Linie sind oder nicht. Ein Pseudo-Code ist auch ausreichend, aber Python ist besser.Überprüfung, ob 3 Punkte auf der gleichen Linie sind

+0

Wie ist Ihre Linie definiert? Funktion auf einer 2-D-Ebene? – Daenyth

+0

Was genau hast du? Drei Punkte? oder drei Punkte und eine Linie? –

Antwort

49

können Sie überprüfen, ob die Fläche des Dreiecks ABC ist 0:

[ Ax * (By - Cy) + Bx * (Cy - Ay) + Cx * (Ay - By) ]/2 

Natürlich kann man nicht wirklich von 2.

+2

Das ist viel besser, weil es kein Risiko gibt, durch 0 zu teilen. –

+2

Nur um etwas aufzuzeigen ... Dies ist mathematisch äquivalent zu @dcp's Antwort oben (wenn Sie die '/ 2' ignorieren), aber prüfen, ob der Bereich ist 0 macht es einfacher, eine Toleranz hinzuzufügen ... (dh 'stuff

+1

+1 mathematisch ist das gleiche, aber das Konzept ist einfacher/visuell/geradlinig (ich mag das). – joaquin

0

y - y0 = a(x-x0) (1) während und a = (y1 - y0)/(x1 - x0)A(x0, y0)B(x1, y1)C(x2, y2). Siehe ob C Statistik (1). Sie ersetzen nur die entsprechenden Werte.

Details

44

Dies ist C++, aber man kann es an Python anpassen:

bool collinear(int x1, int y1, int x2, int y2, int x3, int y3) { 
    return (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2); 
} 

Grundsätzlich prüfen wir, dass die Steigungen zwischen Punkt 1 und Punkt 2 und Punkt 1 und Punkt 3 Spiel. Slope ist in y Änderung durch Änderung geteilt in x, so haben wir:

y1 - y2  y1 - y3 
------- = -------- 
x1 - x2  x1 - x3 

Kreuz Vervielfachungs gibt (y1 - y2) * (x1 - x3) == (y1 - y3) * (x1 - x2);

Hinweis, wenn Sie verdoppelt verwenden, können Sie überprüfen, gegen eine epsilon:

bool collinear(double x1, double y1, double x2, double y2, double x3, double y3) { 
    return fabs((y1 - y2) * (x1 - x3) - (y1 - y3) * (x1 - x2)) <= 1e-9; 
} 
+1

Was macht es? – dtb

+0

@ dtb - Ich habe eine Erklärung hinzugefügt, lassen Sie mich wissen, wenn Sie noch Fragen haben. – dcp

+2

netter Trick. Das Überprüfen von Gleitkommazahlen auf Gleichheit ist jedoch nicht sicher. Sie könnten die absolute Differenz gegen einen vordefinierten Schwellenwert testen, der von der Auflösung (Empfindlichkeit) abhängt, die Sie erreichen möchten. –

0

lesen this, und es verwenden, die Gleichung einer Linie, die durch die ersten beiden Punkte zu finden. Folgen Sie den Anweisungen, um m und b zu finden. Berechnen Sie dann für Ihren dritten Punkt mx + b - y. Wenn das Ergebnis Null ist, befindet sich der dritte Punkt in der gleichen Zeile wie die ersten beiden.

0

Regel 1 teilen müssen: In jedem linearen 2d Raum, zwei Punkte sind immer auf der gleichen Linie.

Nehmen Sie 2 Punkte und erstellen Sie eine Gleichung, die eine Linie durch sie darstellt. Dann überprüfen Sie, ob der dritte Punkt auch in dieser Zeile ist.

Viel Glück.