Samstag, 29. Januar 2011

Nice To Know: Kollinearität von drei Punkten im Dreidimensionalen

Um zu bestimmen, ob drei Punkte im Dreidimensionalen auf einer Geraden liegen, also kollinear sind, lässt sich eine Flächenberechnung des Dreiecks missbrauchen, die in folgender Formel gegeben ist:



Drei Punkte x, y und z sind kollinear, wenn die Fläche des durch sie erzeugten Dreieckes 0 ist. Da also nur interessant ist, ob die Fläche 0 ist oder nicht, kann man sich an der Formel das Dividieren durch zwei und das Wurzel ziehen sparen. Das ändert nichts an der Tatsache, ob die Dreiecksfläche 0 oder nicht 0 ist.

Damit lässt sich folgender Code in Java zur Überprüfung auf Kollinearität schreiben. Die zweite Methode berechnet die Determinante der Matrix nach der Regel von Sarrus. Die Methode isColinear verzichtet auch auf das Quadrieren der Determinanten, was auch nichts an der Dreiecksfläche hinsichtlich 0 oder nicht 0 ändert.
public static boolean isCollinear
        (Point p1, Point p2, Point p3) {
  double d[][] = null;

  d = new double[][]{
            {p1.getX(), p2.getX(), p3.getX()},
            {p1.getY(), p2.getY(), p3.getY()},
            {1, 1, 1}
          };
  if (determinant(d) != 0.0) {
    return false;
  }
  d = new double[][]{
            {p1.getY(), p2.getY(), p3.getY()},
            {p1.getZ(), p2.getZ(), p3.getZ()},
            {1, 1, 1}
          };
  if (determinant(d) != 0.0) {
    return false;
  }
  d = new double[][]{
            {p1.getZ(), p2.getZ(), p3.getZ()},
            {p1.getX(), p2.getX(), p3.getX()},
            {1, 1, 1}
          };
  if (determinant(d) != 0.0) {
    return false;
  }
  return true;
}

public static double determinant
        (double[][] matrix) {
  return
    (matrix[0][0] * matrix[1][1] * matrix[2][2] +
     matrix[0][1] * matrix[1][2] * matrix[2][0] +
     matrix[0][2] * matrix[1][0] * matrix[2][1])
        -
    (matrix[0][2] * matrix[1][1] * matrix[2][0] +
     matrix[0][1] * matrix[1][0] * matrix[2][2] +
     matrix[0][0] * matrix[1][2] * matrix[2][1]);
}

(Der Eintrag entstand um diesen Eintrag abzukürzen und auf die dritte Dimension zu erweitern.)

1 Kommentar:

  1. Also wenn Du weisst, daß Deine Matrizen in der 3. Reihe alle 1 sind, ist es doch ganz schön verschwenderisch, die Determinante nach der allgemeinen Sarrus'schen Regel zu berechnen, oder nicht?
    Im Übrigen geht es auch viel einfacher, wie mir ein Blick in meine (vom DDR-Eintrittsgeld 1981 gekaufte) Formelsammlung verrät: Es muss nur die Determinante der Matrix
    x1 y1 1
    x2 y2 1
    x3 y3 1
    gleich Null sein. Mithin reicht also mit dem eingangs gesagten:
    x1*y2+y1*x3+x2*y3-x1*y3-y1*x2-y2*x3 == 0
    das ist doch *etwas* einfacher, oder? LG

    AntwortenLöschen