Projektion eines 3D-Raumpunktes auf eine zweidimensionale Ebene

Eine Ebene im 3-dimensionalen Raum kann mit Hilfe von zwei linear unabhängigen (also nicht parallelen) Basisvektoren \(\vec{u}\) und \(\vec{v}\) sowie deren gemeinsamen Ursprung \(\vec{r_0}\) definiert werden. Die Linearkombinationen der Basisvektoren ” spannen die Ebene auf “. Die Vektoren werden praktischerweise oft orthogonal sein, meistens werden diese auch auf den Betrag 1 normiert. Wir nehmen im Folgenden immer beides an. Der Normalenvektor steht senkrecht auf der Ebene und ist das Kreuzprodukt der Basisvektoren, also \(\vec{n} = \vec{u} \times \vec{v}\):

Für alle Punkte \(\vec{r}\) der Ebene gilt:

\[ \vec{n} \cdot \left( \vec{r} - \vec{r_0} \right) = 0 \]

da der Normalenvektor senkrecht auf dem Verbindungsvektor zwischen \(\vec{r}\) und \(\vec{r_0}\) liegen muss und letzterer in der Ebene liegt:

Mit den Bezeichnungen \(\vec{r_0} = (x_0, y_0, z_0)\), \(\thinspace \vec{r} = (x, y, z)\) und \(\vec{n} = (n_x, n_y, n_z)\) wird das obige Skalarprodukt in Koordinatenschreibweise

\[ n_x \cdot (x - x_0) + n_y \cdot (y - y_0) + n_z \cdot (z - z_0) = 0 \]

Für die letzte Gleichung kann man auch

\[ n_x \cdot x + n_y \cdot y + n_z \cdot z + d = 0 \hspace{2cm} (1) \]

schreiben, wenn die Abkürzung

\[ d = - (n_x \cdot x_0 + n_y \cdot y_0 + n_z \cdot z_0) \hspace{2cm} (1a) \]

benutzt wird. Alle Punkte \((x, y, z)\) in der Ebene müssen also Gleichung (1) erfüllen. Mehr in diesem Wikipedia-Eintrag.


Sei der Punkt \(\vec{r_p} = (x_p, y_p, z_p)\) die Projektion irgendeines Raumpunktes \(\vec{r_1} = (x_1, y_1, z_1)\) auf die Ebene. Da \(\vec{r_p}\) in der Ebene liegt, muss er gemäß Gleichung (1) die Beziehung

\[ n_x \cdot x_p + n_y \cdot y_p + n_z \cdot z_p + d = 0 \hspace{2cm} (2) \]

erfüllen.

Der Verbindungsvektor zwischen dem Originalpunkt \(\vec{r_1}\) und dem projizierten Punkt \(\vec{r_p}\) muss nun parallel zum Normalenvektor liegen, denn die Projektion ist ja das senkrechte “Lot” auf die Ebene, siehe Abbildung:

Wir haben also:

\[ ( \vec{r_1} -\vec{r_p} ) = k \cdot \vec{n} \]

mit irgendeinem noch unbekannten reellen Faktor \(k\). In Koordinatenschreibweise lautet die letzte Gleichung:

\[ \begin{align*} x_1 - x_p &= k \cdot n_x \\ y_1 - y_p &= k \cdot n_y \\ z_1 - z_p &= k \cdot n_z \hspace{2cm} \text{(3)} \end{align*} \]

oder

\[ \begin{align*} x_p &= x_1 - k \cdot n_x \\ y_p &= y_1 - k \cdot n_y \\ z_p &= z_1 - k \cdot n_z \hspace{2cm} \text{(4)} \end{align*} \]

Wenn wir dies in Gleichung (2) einsetzen, können wir \(k\) bestimmen:

\[ n_x \cdot (x_1 - k \cdot n_x) + n_y \cdot (y_1 - k \cdot n_y) + n_z \cdot ( z_1 - k \cdot n_z) + d = 0 \]

\[ n_x \cdot x_1 + n_y \cdot y_1 + n_z \cdot z_1 + d = k \cdot \left( n_x^2 + n_y^2 + n_z^2 \right) \]

\[ k = \frac{d + n_x \cdot x_1 + n_y \cdot y_1 + n_z \cdot z_1 }{\left( n_x^2 + n_y^2 + n_z^2 \right)} \hspace{2cm} \text{(5)} \]

Alle Größen auf der rechten Seite sind bekannt: \(n_x\), \(n_y\), \(n_z\) sind die Komponenten des Normalenvektors, \(d\) ist aus Gleichung (1) bekannt, der Punkt \((x_1, y_1, z_1)\) ist der zu projizierende Punkt im 3-dimensionalen Raum. Da nun \(k\) bekannt ist, können wir mit Hilfe von Gleichung (4) die Koordinaten des projizierten Punktes berechnen.


Die Lage des projizierten Punktes im Koordinatensystem der Ebene

Gleichung (4) zusammen mit Gleichung (5) gibt die Lage des projizierten Punktes im 3-dimensionalen Koordinatensystem an. Es ist oft notwendig, die Koordinaten im System der Basisvektoren \(\vec{u}\) und \(\vec{v}\) der Ebene zu finden.
Der Einfachheit halber nehmen wir an, dass der Ursprung der Basisvektoren in der 2D-Ebene als Punkt \((0, 0)\) definiert wird. Außerdem setzen wir voraus, dass die Basisvektoren \(\vec{u}\) und \(\vec{v}\) auf die Länge \(1\) normiert und zueinander orthogonal sind. Der Vektor \(\vec{r_p}\) zeigt auf den in die Ebene projizierten Punkt im 3D-Koordinatensystem. Sei \(\vec{r_q}\) der auf diesen Punkt zeigende Vektor im 2D-Koordinatensystem der Ebene: \(\vec{r_q} = (x_q, y_q)\). In der folgenden Skizze stehen \(\vec{u}\) und \(\vec{v}\) also senkrecht aufeinander (die Perspektive kann hier täuschen!):

Wie in der Abbildung ersichtlich, ist \(\vec{r_q} = \vec{r_p} - \vec{r_0}\). Der Vektor \(\vec{r_q}\) liegt vollständig in der Projektions-Ebene.

Wir erhalten die Kordinaten \((x_q, y_q)\) in der Ebene durch:

\[ \begin{align*} x_q &= \vec{u} \cdot \vec{r_q} = \vec{u} \cdot \left( \vec{r_p} - \vec{r_0} \right) \\ y_q &= \vec{v} \cdot \vec{r_q} = \vec{v} \cdot \left( \vec{r_p} - \vec{r_0} \right) \hspace{2cm} \text{(6)} \end{align*} \]

Die jeweils ersten Gleichheitszeichen können durch folgende Überlegungen verstanden werden (und mit Hilfe der obigen Skizze):

\[ \vec{u} \cdot \vec{r_q} = \lvert \vec{u} \lvert \cdot \lvert \vec{r_q}\lvert \cdot \cos{ ( \sphericalangle \vec{u}, \vec{r_q})} =\lvert \vec{r_q}\lvert \cdot \cos{ (\sphericalangle \vec{u}, \vec{r_q})} = x_q \]

und

\[ \vec{v} \cdot \vec{r_q} = \lvert \vec{v} \lvert \cdot \lvert \vec{r_q}\lvert \cdot \cos{ (\sphericalangle \vec{v}, \vec{r_q})} =\lvert \vec{r_q}\lvert \cdot \cos{( \sphericalangle \vec{v}, \vec{r_q})} = y_q \]


Beispiel

Wir beschreiben die Ebene durch zwei Basisvektoren, zum Beispiel

\[ \begin{align*} \vec{u} &= \left( u_1, u_2, u_3 \right) = \left( 1, 0, 0 \right) \\[8pt] \vec{v} &= \left( v_1, v_2, v_3 \right) = \left( 0, 1, 0 \right) \hspace{2cm} \text{(7)} \end{align*} \]

Das Skalarprodukt \(\vec{u} \cdot \vec{v}\) ist Null, die Vektoren stehen also senkrecht aufeinander. Außerdem haben beide Basisvektoren die Länge \(1\), d.h. sie sind normiert.

Die Flächennormale steht senkrecht auf den beiden Basisvektoren, sie ergibt sich aus dem Kreuzprodukt \(\vec{u} \times \vec{v}\):

\[ \vec{n} = \vec{u} \times \vec{v} = \begin{pmatrix} u_2 \cdot v_3 - u_3 \cdot v_2 \\ u_3 \cdot v_1 - u_1 \cdot v_3 \\ u_1 \cdot v_2 - u_2 \cdot v_1 \end{pmatrix} = \begin{pmatrix} 0 \cdot 0 - 0 \cdot 1 \\ 0 \cdot 0 - 1 \cdot 0 \\ 1 \cdot 1 - 0 \cdot 0 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \\ 1 \end{pmatrix} \hspace{2cm} \text{(8)} \]


Mit den obigen Bezeichnungen für die Flächennormale ist also \(\vec{n} = \left(n_x, n_y, n_z \right) = \left(0, 0, 1 \right)\). Mit diesen Werten von \(n_x\), \(n_y\), \(n_z\) und \(d\) reduziert sich die Ebenengleichung \(n_x \cdot x + n_y \cdot y + n_z \cdot z + d = 0\) auf \(z = 0\) für alle \(x,y\), d.h. dass unsere Ebene mit der \(x,y\)-Ebene identisch ist.

Wenn wir für den Nullpunkt \((x_0, y_0, z_0) = (0, 0, 0)\) wählen, wird die Hilfsvariable \(d\) ebenfalls Null:

\[ d = - \left( n_x \cdot x_0 + n_y \cdot y_0 + n_z \cdot z_0 \right) = - \left( n_x \cdot 0 + n_y \cdot 0 + n_z \cdot 0 \right) = 0 \]


Wir wollen den Punkt \((x_1,y_1,z_1) = (1,1,1)\) auf die Ebene projizieren. Dazu berechnen wir \(k\) aus Gleichung (5):

\[ k = \frac{d + n_x \cdot x_1 + n_y \cdot y_1 + n_z \cdot z_1 }{\left( n_x^2 + n_y^2 + n_z^2 \right)} = \frac{0 + 0 \cdot 1 + 0 \cdot 1 + 1 \cdot 1 }{\left( 0^2 + 0^2 + 1^2 \right)} = 1 \]

… und mit diesem \(k\) und Gleichung (4) dann die Komponenten des projizierten Punktes:

\[ \begin{align*} x_p &= x_1 - k \cdot n_x = 1 - 1 \cdot 0 = 1 \\ y_p &= y_1 - k \cdot n_y = 1 - 1 \cdot 0 = 1 \\ z_p &= z_1 - k \cdot n_z = 1 - 1 \cdot 1 = 0 \end{align*} \]

Die 3-dimensionalen Koordinaten des auf die Ebene projizierten Punktes sind also \(\vec{r_p} = \left(x_p, y_p, z_p \right) = (1,1,0)\).

Wir berechnen noch mit Gleichung (6) die Koordinaten des projizierten Punktes im 2D-Koordinatensystem, welches durch die Basisvektoren \(\vec{u}\) und \(\vec{v}\) aufgespannt wird:

\[ x_q = \vec{u} \cdot \left( \vec{r_p} - \vec{r_0} \right) = (1, 0, 0) \cdot \begin{pmatrix} 1 \\ 1 \\ 0 \end{pmatrix} = 1 \]

\[ y_q = \vec{v} \cdot \left( \vec{r_p} - \vec{r_0} \right) = (0, 1, 0) \cdot \begin{pmatrix} 1 \\ 1 \\ 0 \end{pmatrix} = 1 \]

Wir haben also \(\left( x_q, y_q \right) = (1, 1)\). Von der Richtigkeit dieser Koordinaten kann man sich überzeugen, indem das das obige Bild auf die \(x,y\)-Ebene dreht.

Beispiel in R

In R könnte man zur Berechnung des Kreuzproduktes das Package pracma benutzen:

suppressWarnings(library(pracma))
u = c(1, 0, 0) 
v = c(0, 1, 0)
n = cross(u,v) # normal of the plane
n
## [1] 0 0 1
nx = n[1]
ny = n[2]
nz = n[3]

Nach der Definition des Nullpunktes können wir \(d\) berechnen:

x0 = 0  # origin
y0 = 0
z0 = 0 
r0 = c(x0, y0, z0)
d = -(nx*x0 + ny*y0 + nz*z0) 
d
## [1] 0

Der zu projizierende Punkt sei, wie oben:

x1 = 1 # point to project 
y1 = 1
z1 = 1

Wir können nun auch die Hilfsvariable \(k\) berechnen:

k = (d + nx*x1 + ny*y1 + nz*z1) / (nx^2 + ny^2 + nz^2)
k
## [1] 1

Schließlich können die Koordinaten des projizierten Punktes berechnet werden:

xp = x1 - k*nx      
yp = y1 - k*ny  
zp = z1 - k*nz  
rp = c(xp, yp, zp)   # coordinates of the projected point
rp
## [1] 1 1 0

Zur Probe zeichen wir die Ebene, den Originalpunkt und den projizierten Punkt:

## plot the plane
axes3d()
wire3d(scale3d(cube3d(color = "black", alpha = 0.1), 2, 2, 2))
title3d(xlab = "x", ylab = "y", zlab = "z") 
planes3d(nx, ny, nz, d, col = "green", alpha = 0.5, lwd = 2)  
points3d(x1, y1, z1, col = "red", size = 8, pch = 16)  # original point 
points3d(xp, yp, zp, col = "blue", size = 8, pch = 16) # projected point
lines3d(c(x1, xp),  c(y1, yp), c(z1, zp), col = "darkgrey", lwd = 2)
rglwidget()

Der Plot kann mit der Maus gedreht oder vergrößert werden.

Die Koordinaten im Bezugssytem \(\vec{u}; \vec{v}\), wie oben nach Gleichung (6):

xq = u %*% (rp - r0)
yq = v %*% (rp - r0)
rq = c(xq, yq)
rq
## [1] 1 1

Das ist dasselbe Ergebnis, das schon oben erhalten wurde.


Note that all code snippets are designed for comprehensibility, not for efficiency!


uwe.menzel@matstat.org