1.) die gegebenen Punkte
$$
P_1=\Bigg(\matrix{156\cr -22\cr 76}\Bigg)\quad P_2=\Bigg(\matrix{1\cr -72\cr -47}\Bigg)\quad P_3=\Bigg(\matrix{102\cr 84\cr 115}\Bigg)\quad P_4=\Bigg(\matrix{-74\cr -112\cr -117}\Bigg)\\ P_5=\Bigg(\matrix{36\cr -84\cr -35}\Bigg)\quad P_6=\Bigg(\matrix{-58\cr 84\cr 22}\Bigg)\quad P_7=\Bigg(\matrix{135\cr -188\cr -46}\Bigg)\quad P_8=\Bigg(\matrix{-81\cr 37\cr -22}\Bigg)\quad $$
2.) Schreibweise von Vektoren
Punkte werden auch Ortsvektoren genannt, weil sie den Endpunkt eines Vektors bilden, der im Ursprung des Koordinatensystems beginnt.
Man kann also mit Punkten in Vektorschreibweise genauso umgehen wie mit allen anderen Vektoren, die nicht im Ursprung beginnen.
Deshalb kann man schreiben:
$$
\overrightarrow{OP_1}=\overrightarrow{p_1}=\Bigg(\matrix{x_1\cr y_1\cr z_1}\Bigg) = \Bigg(\matrix{156\cr -22\cr 76}\Bigg)$$
Wenn man den Abstands-Vektor $\overrightarrow{a}$ zwischen Punkt 1 und Punkt 2 berechnen will, geht das so:
$$
\style{color:darkgreen}{\overrightarrow{a}}=\overrightarrow{P_1P_2}=\style{color:blue}{\overrightarrow{p_2}}-\style{color:red}{\overrightarrow{p_1}}=
\style{color:blue}{\Bigg(\matrix{1\cr -72\cr -47}\Bigg)}-\style{color:red}{\Bigg(\matrix{156\cr -22\cr 76}\Bigg)}=\style{color:darkgreen}{\Bigg(\matrix{-155\cr -50\cr -123}\Bigg)}\tag{1}
$$
Es werden also die x, y und z-Differenzen jeweils separat gebildet.
Die 3d-Grafik im
Bild 2 unten zeigt diese Differenzbildung.
Bild 2
3.) Rechnen mit Vektoren
Die Schreibweise ist nur ein Aspekt bei Vektoren.
Ein anderer ist die Mathematik in Programmiersprachen.
Vektoren werden als "Array" in Variablen gespeichert, das bedeutet übersetzt etwa Datenreihe oder Datenfeld.
Das ist eine eindimensionale Liste von Werten, die über ihre Positionsnummer in der Liste erreichbar sind.
Die Nummerierung beginnt bei Null.
In den meisten Programmiersprachen werden dafür eckige Klammern verwendet,
in denen eine Anzahl von Werten mit Kommata getrennt eingeschrieben sind und so einer Variablen zugewiesen werden (Zeile 4 und 5 in
Programmcode 1 unten).
In diesem Fall sind es immer genau drei Werte mit den Positionsnummern 0 für x, 1 für y und 2 für z,
die ebenfalls in eckigen Klammern nach einem Variablennamen den Zugriff auf einen einzelnen Wert ermöglichen ( z.B. benutzt im Rückgabewert der "sub"-Funktion in Zeile 2).
function sub($a, $b) {
return [ $a[0]-$b[0], $a[1]-$b[1], $a[2]-$b[2] ];
}
$p1 = [156, -22, 76];
$p2 = [1, -72, -47];
$a = sub($p1, $p2);
// $a ist nun der Vektor [155, 50, 123]
Programmcode 1
Bei der hier verwendeten Programmiersprache PHP müssen alle Variablen mit einem Dollar-Zeichen beginnen, in der Sprache JavaScript ist alles sehr ähnlich jedoch ohne Dollar-Zeichen.
Wie man an dem
Programmcode 1 beispielhaft sieht, muss die Vektor-Schreibweise (1) für die mathematische Berechnung durch Funktionen ergänzt werden,
bevor ein korrektes Ergebnis damit berechnet werden kann. Das gilt auch für die folgenden weiteren Operatoren:
$$\begin{alignat}{3}
\text{Vektor-Addition: }\quad\overrightarrow{x} =& \,\overrightarrow{u}+\overrightarrow{v}\quad &\text{(Funktion "add")} \\
\text{Vektor-Subtraktion: }\quad\overrightarrow{x} =& \,\overrightarrow{u}-\overrightarrow{v}\quad &\text{(Funktion "sub")} \\
\text{Vektor multipliziert mit Zahl: }\quad\overrightarrow{x} =& \,\overrightarrow{u}\cdot k\quad &\text{(Funktion "mul")} \\
\text{Vektor dividiert durch Zahl: }\quad\overrightarrow{x} =& \,\overrightarrow{u} / k\quad &\text{(Funktion "div")} \\
\text{Skalarprodukt zweier Vektoren: }\quad k =& \,\overrightarrow{u}\odot\overrightarrow{v}\quad &\text{(Funktion "punkt")} \\
\text{Kreuzprodukt zweier Vektoren: }\quad\overrightarrow{x} =& \,\overrightarrow{u}\otimes\overrightarrow{v} &\quad\text{(Funktion "kreuz")} \\
\text{Spatprodukt dreier Vektoren: }\quad V =& \,\overrightarrow{u}\otimes\overrightarrow{v}\odot\overrightarrow{w} &\quad\text{(Funktion "spat")} \\
\text{Betrag oder Länge eines Vektors: }\quad d =& \,\sqrt{\overrightarrow{u}\odot\overrightarrow{u}}=|\overrightarrow{u}| &\quad\text{(Funktion "betrag")}
\end{alignat}$$
// addiert die zwei Vektoren "a" und "b"
function add($a, $b) {
return [$a[0] + $b[0], $a[1] + $b[1], $a[2] + $b[2]];
}
// subtrahiert Vektor "b" von Vektor "a"
function sub($a, $b) {
return [$a[0] - $b[0], $a[1] - $b[1], $a[2] - $b[2]];
}
// multipliziert Vektor "a" mit Zahl "k"
function mul($a, $k) {
return [$a[0] * $k, $a[1] * $k, $a[2] * $k];
}
// dividiert Vektor "a" durch Zahl "k"
function div($a, $k) {
return [$a[0] / $k, $a[1] / $k, $a[2] / $k];
}
// bildet das Skalarprodukt aus Vektor "a" und Vektor "b"
function punkt($a, $b) {
return $a[0] * $b[0] + $a[1] * $b[1] + $a[2] * $b[2];
}
// bildet das Kreuzprodukt aus Vektor "a" und Vektor "b"
function kreuz($a, $b) {
return [ $a[1] * $b[2] - $a[2] * $b[1],
$a[2] * $b[0] - $a[0] * $b[2],
$a[0] * $b[1] - $a[1] * $b[0] ];
}
// bildet das Spatprodukt aus Vektor "a", "b" und "c"
function spat($a, $b ,$c) {
return punkt(kreuz($a, $b), $c);
}
// berechnet den Betrag, also die Länge von Vektor "a"
function betrag($a) {
return sqrt(punkt($a, $a));
}
// berechnet das Volumen eines Tetraeders aus den 4 Eckpunkten
function volumen($a, $b, $c, $d) {
$u = sub($a, $b);
$v = sub($a, $c);
$w = sub($a, $d);
return abs(spat($u, $v, $w) / 6);
}
// berechnet den Abstand von Punkt "d" zur Ebene des Dreiecks "abc"
function distanz($a, $b, $c, $d) {
$u = sub($a, $b);
$v = sub($a, $c);
$w = sub($a, $d);
$x = kreuz($u, $v);
return abs(punkt($x, $w) / betrag($x));
}
Programmcode 2
4.) das Suchen der Punkte, die in einer Ebene liegen
Nach der langen Vorbereitung geht es jetzt schnell zur Lösung der Rätselfragen.
Die folgende Überlegung soll die Arbeit daran optimieren.
Drei Punkte bilden auch im Raum eine Fläche, die eine Ebene festlegt.
Nun könnte man alle Kombinationen von 3 aus 8 Punkten als Dreieck ansehen und die übrigen 5 Punkte daraufhin prüfen, ob sie in der Ebene des Dreiecks liegen.
Die Anzahl der verschiedenen Dreiecke ist $\left( { \scriptstyle \matrix{8\cr 3} } \right)=56$ multipliziert mit $5$ sind $280$ Prüfungen.
Da man ohnehin nur mit Rechnerunterstützung zum Ergebnis kommt ist der Aufwand überschaubar.
Andererseits ist offensichtlich, dass es dabei zu Wiederholungen der gleichen vier beteiligten Punkte kommt, nämlich 4 mal: einer der vier Punkte ist derjenige, dessen Abstand zur Dreieckebene auf Null geprüft werden muss und das kann jeder der vier Punkte mal sein.
Tatsächlich kommt man mit $\left( { \scriptstyle \matrix{8\cr 4} } \right)=70$ Prüfungen aus, nämlich alle verschiedenen Kombinationen von 4 aus 8.
Wie laufen diese Prüfungen ab?
Bei der Suche im Internet gibt es viele Hinweise auf die Berechnung des Abstands eines Punktes von einer Ebene.
Aber die einfachste Lösung habe ich nirgendwo gefunden: man nimmt jeweils die vier Punkte als Eckpunkte eines Tetraeders an und berechnet das Volumen.
Wenn das Volumen des Tetraeders Null ist sind alle vier Punkte mit Sicherheit in einer Ebene.
Nun wird langsam klar, welchen Sinn die Vorarbeiten zum Rechnen mit Vektoren hatten.
Es ist die Funktion "volumen" in Zeile 36 von
Programmcode 2, die sofort eingesetzt werden kann.
Es müssen nur noch die 70 Vierergruppen damit geprüft werden.
Das Ergebnis zeigt die folgende
Tabelle 1:
Zeile | Tetraeder Eckpunkte | Tetraeder Volumen |
1 | 1 2 3 4 | 3,3333 |
2 | 1 2 3 5 | 1046,0000 |
3 | 1 2 3 6 | 835,0000 |
4 | 1 2 3 7 | 838,3333 |
5 | 1 2 3 8 | 763,8333 |
6 | 1 2 4 5 | 133,3333 |
7 | 1 2 4 6 | 111,6667 |
8 | 1 2 4 7 | 111,6667 |
9 | 1 2 4 8 | 94,1667 |
10 | 1 2 5 6 | 1641,0000 |
11 | 1 2 5 7 | 1507,6667 |
12 | 1 2 5 8 | 1003,8333 |
13 | 1 2 6 7 | 111,6667 |
14 | 1 2 6 8 | 1999,6667 |
15 | 1 2 7 8 | 1905,5000 |
16 | 1 3 4 5 | 1596,0000 |
17 | 1 3 4 6 | 1273,3333 |
18 | 1 3 4 7 | 1283,3333 |
19 | 1 3 4 8 | 1171,3333 |
20 | 1 3 5 6 | 226,0000 |
21 | 1 3 5 7 | 1316,0000 |
22 | 1 3 5 8 | 1841,0000 |
23 | 1 3 6 7 | 1231,6667 |
24 | 1 3 6 8 | 1634,6667 |
25 | 1 3 7 8 | 514,5000 |
26 | 1 4 5 6 | 2532,6667 |
27 | 1 4 5 7 | 2132,6667 |
28 | 1 4 5 8 | 1766,3333 |
29 | 1 4 6 7 | 335,0000 |
30 | 1 4 6 8 | 3268,0000 |
31 | 1 4 7 8 | 2985,5000 |
32 | 1 5 6 7 | 2390,3333 |
33 | 1 5 6 8 | 2671,3333 |
34 | 1 5 7 8 | 3916,5000 |
35 | 1 6 7 8 | 2731,0000 |
36 | 2 3 4 5 | 420,0000 |
37 | 2 3 4 6 | 330,0000 |
38 | 2 3 4 7 | 330,0000 |
39 | 2 3 4 8 | 310,0000 |
40 | 2 3 5 6 | 1656,0000 |
41 | 2 3 5 7 | 2076,0000 |
42 | 2 3 5 8 | 1035,0000 |
43 | 2 3 6 7 | 330,0000 |
44 | 2 3 6 8 | 2035,5000 |
45 | 2 3 7 8 | 2345,5000 |
46 | 2 4 5 6 | 870,0000 |
47 | 2 4 5 7 | 870,0000 |
48 | 2 4 5 8 | 535,0000 |
49 | 2 4 6 7 | 0,0000 |
50 | 2 4 6 8 | 1062,5000 |
51 | 2 4 7 8 | 1062,5000 |
52 | 2 5 6 7 | 870,0000 |
53 | 2 5 6 8 | 34,5000 |
54 | 2 5 7 8 | 500,5000 |
55 | 2 6 7 8 | 1062,5000 |
56 | 3 4 5 6 | 2436,0000 |
57 | 3 4 5 7 | 3696,0000 |
58 | 3 4 5 8 | 840,0000 |
59 | 3 4 6 7 | 990,0000 |
60 | 3 4 6 8 | 2458,0000 |
61 | 3 4 7 8 | 3388,0000 |
62 | 3 5 6 7 | 2532,0000 |
63 | 3 5 6 8 | 2691,0000 |
64 | 3 5 7 8 | 4956,0000 |
65 | 3 6 7 8 | 3648,5000 |
66 | 4 5 6 7 | 2610,0000 |
67 | 4 5 6 8 | 1363,0000 |
68 | 4 5 7 8 | 2968,0000 |
69 | 4 6 7 8 | 3187,5000 |
70 | 5 6 7 8 | 1466,5000 |
Tabelle 1
Die einzige Zeile mit einem Volumen von Null ist die Zeile 49 mit den Punkten 2, 4, 6 und 7.
Damit ist die erste Rätselfrage beantwortet.
5.) der Abstand der übrigen 4 Punkte von der Ebene
Die Methode mit dem Volumen eines Tetraeders kann auch für die zweite Frage eingesetzt werden.
Dabei verschwindet das Volumen des Tetraeders nicht und man kann als Ziel dessen Höhe berechnen.
Das ist sehr einfach.
Man wählt aus den vier Punkten 2, 4, 6 und 7 drei aus, egal welche, und bildet damit ein Dreieck, welches die Grundseite des Tetraeders sein soll.
Mit dem vierten hinzukommenden Punkt außerhalb der Ebene ist wie schon bekannt das Volumen zu berechnen.
Weiterhin ist die Fläche des Dreiecks ebenfalls leicht mit dem Kreuzprodukt zweier Seitenvektoren zu berechnen.
Dann ist die Höhe des Tetraeders und damit der Abstand von der Ebene
$$
h=\frac{3\cdot Volumen}{Grundseite}=\frac{3\cdot\frac16\cdot |Spatprodukt|}{\frac12 \cdot |Kreuzprodukt|}=\frac{|\overrightarrow{u}\otimes\overrightarrow{v}\odot\overrightarrow{w}|}{|\overrightarrow{u}\otimes\overrightarrow{v}|}
$$
und das ist die Funktion "distanz" in Zeile 43 von
Programmcode 2.
In der folgenden
Tabelle 2 sind die Abstände der Punkte 1, 3, 5 und 8 von der Ebene berechnet,
und nicht nur mit einem Dreieck als Grundseite, sondern in allen 4 Varianten.
Es kommt natürlich immer das gleiche heraus und damit ist die Rätselfrage 2 beantwortet.
Zeile | Dreieck | Punkt 1 | Punkt 3 | Punkt 5 | Punkt 8 |
1 | 2 4 6 | 0,03576948 | 0,10570684 | 0,27868166 | 0,34034398 |
2 | 2 4 7 | 0,03576948 | 0,10570684 | 0,27868166 | 0,34034398 |
3 | 2 6 7 | 0,03576948 | 0,10570684 | 0,27868166 | 0,34034398 |
4 | 4 6 7 | 0,03576948 | 0,10570684 | 0,27868166 | 0,34034398 |
Tabelle 2