Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| kurse:efcomputergrafik:kw47 [2019/11/06 07:01] – [Aufgaben] Ivo Blöchliger | kurse:efcomputergrafik:kw47 [2019/11/22 08:09] (current) – [Eindeutigkeiten der Kombinationen] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Einleitende Theorie ====== | ||
| + | Wir werden im folgenden Punkte im Raum mit deren Ortsvektoren gleichsetzen und als mathematische Objekte nicht mehr unterscheiden, | ||
| + | |||
| + | ===== Linearkombination ===== | ||
| + | Gegeben ist eine Menge $V$ von (abstrakten) " | ||
| + | * Vektoren (aus der Vektorgeometrie) | ||
| + | * Funktionen (z.B. Polynome) | ||
| + | |||
| + | Eine **Linearkombination** von " | ||
| + | $$ | ||
| + | r_1 v_1 + r_2 v_2 + \ldots r_n v_n \qquad \qquad | ||
| + | \text{mit } r_i \in \mathbb{R} \text{ und } v_i \in V | ||
| + | $$ | ||
| + | |||
| + | Beispiele: | ||
| + | * Die Menge aller Linearkombinationen der Einheitsvektoren ergibt alle möglichen Vektoren. Man sagt, die Einheitsvektoren bilden eine **Basis**. | ||
| + | * Die Menge aller Linearkombinationen der Polynome $1,\, x,\, x^2$ ist die Menge aller möglichen Polynome bis und mit 2. Grades. | ||
| + | |||
| + | ===== Konvexe Kombinationen ===== | ||
| + | Ein konvexe Kombination ist eine Linearkombination mit der zusätzlichen Bedingung, dass die Koeffizienten $r_i$ die Bedingungen $\sum_i r_i =1$ und $r_i \in [0,1]$ erfüllen. | ||
| + | |||
| + | ===== Aufgaben ===== | ||
| + | ==== Geometrische Interpretation ==== | ||
| + | |||
| + | Seien $\vec u$ und $\vec v$ Vektoren im Raum. Welchen Punktemengen entspricht | ||
| + | |||
| + | a) die Menge aller Linearkombinationen von $\vec u$ und $\vec v$? | ||
| + | |||
| + | b) die Menge aller konvexen Kombinationen von $\vec u$ und $\vec v$? | ||
| + | |||
| + | c) die Menge aller Linearkombinationen von $\vec v$? | ||
| + | |||
| + | d) die Menge aller konvexen Kombination von $\vec v$? | ||
| + | |||
| + | e) die Menge aller konvexen Kombinationen von 3 Vektoren im Raum? | ||
| + | |||
| + | ==== Wiederholte Kombinationen ==== | ||
| + | Beweisen Sie dass | ||
| + | * die Linearkombination von Linearkombinationen eine einfache Linearkombination ist. | ||
| + | * die konvexe Kombination von konvexen Kombinationen eine einfache konvexe Kombination ist. | ||
| + | |||
| + | ==== Eindeutigkeiten der Kombinationen ==== | ||
| + | Gegeben ist ein Ortsvektor $\vec p$ und eine Menge von $n$ Vektoren $\vec v_i$. Angenommen $\vec p$ ist als Kombination (linear oder konvex) der Vektoren $\vec v_i$ darzustellen, | ||
| + | * ist die Linearkombination eindeutig, wenn die Vektoren linear unabhängig sind und damit einen $n$-dimensionalen Unterraum aufspannen. | ||
| + | * ist die konvexe Kombination eindeutig, wenn die Dimension der konvexen Hülle $n-1$ ist. | ||
| + | |||
| + | Surafel hat einen sehr eleganten Beweis geliefert. Die Idee ist, dass man die verschobenen Vektoren $\vec u_i=\vec v_i - \vec v_1$ betrachtet. | ||
| + | |||
| + | Sei $\vec p = \sum r_i \vec v_i$, mit $\sum r_i = 1$, $r_i \in [0,1]$. | ||
| + | |||
| + | Die entsprechende konvexe Kombination der Vektoren $\vec u_i$ liefert | ||
| + | $\sum r_i(\vec v_i - \vec v_1) = \sum r_i\vec v_i - \sum r_i \vec v_1 = \vec p-\vec v_1$. | ||
| + | Die Vektoren $\vec u_i$ für $i \geq 2$ spannen einen $n-1$-dimensionalen Unterraum auf, womit die Linearkombination | ||
| + | $\sum_{i=2}^n r_i \vec u_i = \vec p - \vec v_1$ eindeutig ist. Damit ist der Koeffizient für $r_1$ (über die Bedingung $\sum r_i =1$) ebenfalls eindeutig. | ||
| + | |||
| + | ====== Geometrische Definition von Bezierkurven ====== | ||
| + | Eine Bezierkurve $n$-ten Grades ist definiert durch $n+1$ **Kontrollpunkte**. Die einzelnen Punkte auf der Kurve lassen sich durch einen Parameter $t \in [0,1]$ parametrieren. | ||
| + | |||
| + | ===== Grad 1 ===== | ||
| + | Die Bezierkurve vom Grad 1 mit den Kontrollpunkten $p_0$ und $p_1$ entspricht der Menge aller konvexen Kombinationen der beiden Punkte. | ||
| + | |||
| + | Bestimmen Sie eine Parametrierung dieser " | ||
| + | $$ | ||
| + | p(t) = (1-t) \cdot p_0 + t \cdot p_1 =: I(t, p_0, p_1) | ||
| + | $$ | ||
| + | Die Funktion $I$ interpoliert linear zwischen $p_0$ und $p_1$ für $t \in [0,1]$. | ||
| + | ==== Aufgaben ==== | ||
| + | === Animation === | ||
| + | Programmieren Sie eine Animation (ca. 50 Schritte), wie der Punkt $p(t)$ läuft. | ||
| + | |||
| + | Verwenden Sie dazu die bereitgestellte {{ : | ||
| + | |||
| + | Für den Umgang mit der Klasse " | ||
| + | |||
| + | <code python interpolation.py> | ||
| + | from gpanel import * | ||
| + | from vector import Vector | ||
| + | # Die Datei vector.py muss im gleichen Verzeichnis wie diese Programm liegen. | ||
| + | |||
| + | makeGPanel(0, | ||
| + | |||
| + | # t in [0,1] | ||
| + | # p0, p1, sind Vektoren | ||
| + | # Liefert die lineare interpolation | ||
| + | def interpolate(t, | ||
| + | return (1-t)*p0+t*p1 | ||
| + | |||
| + | def linie(p0, p1): | ||
| + | line(p0[0], p0[1], p1[0], p1[1]) | ||
| + | | ||
| + | def kreis(p): | ||
| + | move(p[0], p[1]) | ||
| + | fillCircle(0.02) | ||
| + | |||
| + | n = 100 | ||
| + | enableRepaint(False) | ||
| + | intpts = [Vector((0.1, | ||
| + | for i in range(n+1): | ||
| + | t=i/n | ||
| + | clear() | ||
| + | # Ganze Linie | ||
| + | linie(intpts[0], | ||
| + | # Interpolierter Punkt | ||
| + | p = interpolate(t, | ||
| + | # Kreiszentrum | ||
| + | kreis(p) | ||
| + | repaint() | ||
| + | delay(60) | ||
| + | | ||
| + | </ | ||
| + | |||
| + | ===== Grad 2, quadratische Bezierkurve (habe ich selten angetroffen) ===== | ||
| + | Gegeben sind 3 **Kontrollpunkte** $p_0$, $p_1$, $p_2$. | ||
| + | Der Kuvenpunkt $p(t)$ wird wie folgt berechnet: | ||
| + | * Man berechne $q_i(t) = I(p_i, p_{i+1},t)$ für $i\in \{0,1\}$. Und daraus | ||
| + | * $p(t) = I(q_0, q_1, t)$ | ||
| + | |||
| + | ==== Aufgaben ==== | ||
| + | === Konvexe Hülle === | ||
| + | Zeigen Sie, dass $p(t)$ immer im Dreieck $p_0$, $p_1$, $p_2$ liegt. | ||
| + | === Tangenten === | ||
| + | Begründen Sie plausibel, wie die Tangenten in den Punkten $p(0)$, $p(0.5)$ und $p(1)$ liegen. | ||
| + | === Animation === | ||
| + | Programmieren Sie eine Animation (ca. 50 Schritte), wie der Punkt $p(t)$ läuft. | ||
| + | |||
| + | ===== Grad 3, kubische Bezierkurve (treffe ich häufig an) ===== | ||
| + | Gegeben sind 4 **Kontrollpunkte** $p_i$ mit $i\in\{0, | ||
| + | Der Punkt $p(t)$ wird wie folgt berechnet: | ||
| + | |||
| + | * Man berechne $s_i(t) = I(p_i, p_{i+1},t)$ für $i\in \{0,1,2\}$. Und daraus | ||
| + | * $q_i(t) = I(s_i, s_{i+1},t)$ für $i\in \{0,1\}$. Und daraus | ||
| + | * $p(t) = I(q_0, q_1, t)$ | ||
| + | |||
| + | |||
| + | ==== Aufgaben ==== | ||
| + | |||
| + | === Animation === | ||
| + | Programmieren Sie eine Animation (ca. 50 Schritte), wie der Punkt $p(t)$ läuft. | ||
| + | |||
| + | <code python bezierallgemein.py> | ||
| + | from gpanel import * | ||
| + | from vector import Vector | ||
| + | import math | ||
| + | # Die Datei vector.py muss im gleichen Verzeichnis wie diese Programm liegen. | ||
| + | |||
| + | makeGPanel(0, | ||
| + | |||
| + | # t in [0,1] | ||
| + | # p0, p1, sind Vektoren | ||
| + | # Liefert die lineare interpolation | ||
| + | def interpolate(t, | ||
| + | return (1-t)*p0+t*p1 | ||
| + | |||
| + | def linie(p0, p1): | ||
| + | line(p0[0], p0[1], p1[0], p1[1]) | ||
| + | | ||
| + | def kreis(p, typ=0): | ||
| + | move(p[0], p[1]) | ||
| + | if typ==0: | ||
| + | circle(0.04) | ||
| + | else: | ||
| + | fillCircle(0.02) | ||
| + | |||
| + | n = 100 | ||
| + | enableRepaint(False) | ||
| + | #pini = [Vector((0.4, | ||
| + | num = 20; | ||
| + | # Folge von Punkten auf einer Lissajou-Figur | ||
| + | pini = [Vector([math.sin(i/ | ||
| + | kurve=[] | ||
| + | for i in range(n+1): | ||
| + | t=i/n | ||
| + | clear() | ||
| + | p = pini | ||
| + | while len(p)> | ||
| + | # Neue Punkte | ||
| + | q = [] | ||
| + | for j in range(len(p)-1): | ||
| + | linie(p[j], p[j+1]) | ||
| + | q.append(interpolate(t, | ||
| + | kreis(q[j]) | ||
| + | p = q | ||
| + | kurve.append(p[0]) | ||
| + | for k in kurve: | ||
| + | kreis(k,1) | ||
| + | repaint() | ||
| + | delay(60) | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Grad $n$ (wird selten für $n>3$ verwendet) ===== | ||
| + | Gegeben sind $n+1$ Kontrollpunkte $p_i$ mit $i \in \{0, | ||
| + | |||
| + | Man interpoliert aufeinanderfolgende Punktepaare linear und bekommt so eine Liste von $n-1$ Punkten. | ||
| + | Mit dieser Liste verfährt man gleich, bis nur noch 1 Punkt übrig bleibt. Das ist Punkt $p(t)$. | ||
| + | |||