Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
kurse:efcomputergrafik:kw48 [2019/11/22 10:14] Ivo Blöchliger [Vorgehen] |
kurse:efcomputergrafik:kw48 [2019/12/04 11:48] Ivo Blöchliger |
||
---|---|---|---|
Line 5: | Line 5: | ||
===== Form der Polynome und deren Ableitungen ===== | ===== Form der Polynome und deren Ableitungen ===== | ||
+ | Kontrollpunkte $\vec p_0$ bis $\vec p_n$: | ||
+ | $$ | ||
+ | \vec p(t) = \sum_{i=0}^n {n \choose i} (1-t)^{n-i} \cdot t^i \cdot \vec p_i | ||
+ | $$ | ||
+ | Für Grad 3: | ||
+ | $$ | ||
+ | \vec p(t) = (1-t)^3 \cdot \vec p_0 + 3(1-t)^2t \cdot \vec p_1 + 3 \cdot (1-t)t^2 \cdot \vec p_2 + t^3 \cdot \vec p_3 | ||
+ | $$ | ||
===== Ableitungen von $p(t)$ für $t \in [0,1]$ ===== | ===== Ableitungen von $p(t)$ für $t \in [0,1]$ ===== | ||
+ | $$ | ||
+ | v(t) = -3(1-t)^2 \cdot \vec p_0 + | ||
+ | 3(1-t)(1-3t)\cdot \vec p_1 + | ||
+ | 3t(2-3t) \cdot \vec p_2 + | ||
+ | 3t^2 \cdot \vec p_3 | ||
+ | $$ | ||
- | ====== Interpolation mit kubischen Funktionen ====== | + | Man findet |
- | Gesucht ist eine kubische Funktion durch 2 gegebene Punkte | + | Analog mit $\vec v(1) = 3(\vec p_3 - \vec p_2)$. |
- | Variante | + | Mit Maxima: |
+ | <code maxima> | ||
+ | p(t, | ||
+ | define(v(t), | ||
+ | tex(v(t)); | ||
+ | define(a(t), | ||
+ | tex(a(t)); | ||
+ | </ | ||
+ | liefert | ||
+ | $$3\, | ||
+ | | ||
+ | und | ||
+ | $$-6\, | ||
+ | | ||
+ | |||
+ | Interessant sind auch hier die Werte von $a(0)$ und $a(1)$: | ||
+ | $$a(0) = 6\, | ||
+ | $$a(1) = 6\, | ||
+ | |||
+ | |||
+ | ===== Darstellung von Kurven vom Grad 1 und 2 mit Hilfe von einer Kurve vom Grad 3 ===== | ||
+ | ==== Grad 1 ==== | ||
+ | Damit die Geschwindigkeit für $t=0$ übereinstimmt, | ||
+ | <code maxima> | ||
+ | p(t, | ||
+ | factorout(expand(p(t, | ||
+ | tex(%); | ||
+ | </ | ||
+ | liefert: | ||
+ | $$b\,t+a\,\left(1-t\right)$$ | ||
+ | ==== Grad 2 ==== | ||
+ | Für den Grad zwei, mit Kontrollpunkten $q_0, q_1, q_2$ ist $\vec v(0) = 2(\vec q_1-\vec q_0)$. Damit die Geschwindigkeiten für $t=0$ übereinstimmen muss $p_1 = \frac{1}{3}q_0 + \frac{2}{3}q_1$ sein. Analog für $p_2$. | ||
+ | Beweis wieder mit Maxima: | ||
+ | <code maxima> | ||
+ | p(t, | ||
+ | factorout(expand(p(t, | ||
+ | tex(%); | ||
+ | </ | ||
+ | liefert: | ||
+ | $$c\, | ||
- | Variante 2: Anstatt die kanonische Basis $1, | ||
====== Analyse von SVG-Pfaden ====== | ====== Analyse von SVG-Pfaden ====== | ||
Line 50: | Line 102: | ||
===== Umgang mit Inkscape ===== | ===== Umgang mit Inkscape ===== | ||
+ | |||
+ | Download für die Schulcomputer: | ||
+ | |||
Nützliche Tastenkombinationen: | Nützliche Tastenkombinationen: | ||
* F1: Auswahlmodus (zum kopieren, löschen, verschieben, | * F1: Auswahlmodus (zum kopieren, löschen, verschieben, | ||
- | * F2: Edit-Modus (Manipulation der Pfadelemente. | + | * F2: Edit-Modus (Manipulation der Pfadelemente). |
Pfad-Manipulationen: | Pfad-Manipulationen: | ||
Line 58: | Line 113: | ||
* Ctrl-K: Combine (mehrere Pfade in einen Pfad zusammenfassen). | * Ctrl-K: Combine (mehrere Pfade in einen Pfad zusammenfassen). | ||
+ | ===== Text-Analyse mit Python ===== | ||
+ | === Datei einlesen === | ||
+ | Von https:// | ||
+ | <code python> | ||
+ | with open(' | ||
+ | content = content_file.read() | ||
+ | </ | ||
+ | === Text finden === | ||
+ | https:// | ||
+ | <code python> | ||
+ | position = content.find("< | ||
+ | if (position!=-1): | ||
+ | # tu was damit | ||
+ | </ | ||
+ | === Substring === | ||
+ | <code python> | ||
+ | a=" | ||
+ | a[2:5] # -> liefert " | ||
+ | </ | ||
+ | === Text Analyse === | ||
+ | Ist der Path-String einmal gefunden, geht es darum, diesen zu analysieren. Als erster Schritt soll dieser nach Leerschlägen aufgeteilt werden: | ||
+ | <code python> | ||
+ | txt = "foo bar baz boo" | ||
+ | items = txt.split(" | ||
+ | </ | ||
+ | |||
+ | === Convertierung in Zahlen === | ||
+ | <code python> | ||
+ | zahl = float(" | ||
+ | </ | ||
+ | |||
+ | |||
+ | <hidden converter.py> | ||
+ | <code python converter.py> | ||
+ | |||
+ | def convert(elements): | ||
+ | # Aktuelle Koordinaten | ||
+ | x = 0 | ||
+ | y = 0 | ||
+ | # Position im elements Array | ||
+ | e = 0 | ||
+ | # letztes Kommando | ||
+ | lastCMD = "" | ||
+ | while e < len(elements): | ||
+ | if elements[e]==" | ||
+ | x = float(elements[e+1]) | ||
+ | y = float(elements[e+2]) | ||
+ | e = e+3 # 3 Element konsumiert | ||
+ | elif elements[e]==" | ||
+ | x = x + float(elements[e+1]) | ||
+ | y = y + float(elements[e+2]) | ||
+ | e = e+3 # 3 Element konsumiert | ||
+ | |||
+ | |||
+ | |||
+ | with open(' | ||
+ | content = content_file.read() | ||
+ | | ||
+ | # print(content) | ||
+ | # Anfangsposition vom path | ||
+ | position = content.find("< | ||
+ | if position< | ||
+ | raise BaseException(" | ||
+ | |||
+ | # | ||
+ | # Erste 20 Zeichen vom path | ||
+ | # | ||
+ | |||
+ | # d=" suchen... (ab der Position position) | ||
+ | while True: | ||
+ | position = content.find(" | ||
+ | if position< | ||
+ | BaseException(" | ||
+ | | ||
+ | if content[position-1]<' | ||
+ | break | ||
+ | | ||
+ | position+=1 | ||
+ | # Erste 20 Zeichen vom d | ||
+ | |||
+ | start = position+3 | ||
+ | ende = content.find(" | ||
+ | |||
+ | pfaddef = content[start: | ||
+ | print(pfaddef) | ||
+ | pfaddef = pfaddef.replace(",", | ||
+ | print(pfaddef) | ||
+ | elemente = pfaddef.split(" | ||
+ | print(elemente) | ||
+ | |||
+ | </ | ||
+ | </ | ||