kurse:efcomputergrafik:kw48

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
kurse:efcomputergrafik:kw48 [2019/11/26 14:23]
Ivo Blöchliger [Form der Polynome und deren Ableitungen]
kurse:efcomputergrafik:kw48 [2019/12/04 11:48]
Ivo Blöchliger
Line 16: Line 16:
 ===== 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 $\vec v(0) = 3(\vec p_1 - \vec p_0)$, also Tangente parallel zu $P_0P_1$
-Gesucht ist eine kubische Funktion durch 2 gegebene Punkte $P=(0,y_P)$ und $Q=(1,y_Q)$ mit gegebenen Tangentensteigungen $m_Pund $m_Qin diesen Punkten.+Analog mit $\vec v(1) = 3(\vec p_3 - \vec p_2)$.
  
-Variante 1: Ansatz $f(x) = ax^3+bx^2+cx+d$, Gleichungssystem aufstellenlösen.+Mit Maxima: 
 +<code maxima> 
 +p(t,a,b,c,d):=(1-t)^3*a+3*(1-t)^2*t*b+3*(1-t)*t^2*c+t^3*d; 
 +define(v(t), factorout(diff(p(t,a,b,c,d),t),t)); 
 +tex(v(t)); 
 +define(a(t), factorout(diff(v(t),t),t)); 
 +tex(a(t)); 
 +</code> 
 +liefert 
 +$$3\,d\,t^2+3\,b\,\left(t-1\right)\,\left(3\,t-1\right)-3\,c\,t\, 
 + \left(3\,t-2\right)-3\,a\,\left(t-1\right)^2$$ 
 +und 
 +$$-6\,c\,\left(3\,t-1\right)+6\,b\,\left(3\,t-2\right)+6\,d\,t-6\,a\, 
 + \left(t-1\right)$$ 
 + 
 +Interessant sind auch hier die Werte von $a(0)$ und $a(1)$: 
 +$$a(0) = 6\,c-12\,b+6\,a$$ 
 +$$a(1) = 6\,d-12\,c+6\,b$$ 
 + 
 + 
 +===== 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, müssen die Kontrollpunkte sich bei $t=\frac{1}{3}$ und $t=\frac{2}{3}$ befinden. Beweis mit Maxima (ein OpenSource CAS-Programm): 
 +<code maxima> 
 +p(t,a,b,c,d):=(1-t)^3*a+3*(1-t)^2*t*b+3*(1-t)*t^2*c+t^3*d
 +factorout(expand(p(t, a, (2/3*a+1/3*b), a/3+2/3*b,b)),t); 
 +tex(%); 
 +</code> 
 +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,a,b,c,d):=(1-t)^3*a+3*(1-t)^2*t*b+3*(1-t)*t^2*c+t^3*d; 
 +factorout(expand(p(t, a, (2/3*b+1/3*a), c/3+2/3*b,c)),t); 
 +tex(%); 
 +</code> 
 +liefert:  
 +$$c\,t^2-2\,b\,\left(t-1\right)\,t+a\,\left(t-1\right)^2$$
  
-Variante 2: Anstatt die kanonische Basis $1,x,x^2,x^3$ zu verwenden, soll eine Basis mit der Eigenschaft gefunden werden, dass von folgenden Werten immer nur genau einer Eins und die restlichen Null sind: $b(0), b(1), b'(0), b'(1)$. Die gesuchte Lösung ergibt sich dann als einfache Linearkombination mit den gegebenen Koeffizienten. 
  
 ====== Analyse von SVG-Pfaden ====== ====== Analyse von SVG-Pfaden ======
Line 58: Line 102:
  
 ===== Umgang mit Inkscape ===== ===== Umgang mit Inkscape =====
 +
 +Download für die Schulcomputer: https://fginfo.ksbg.ch/dokuwiki/doku.php?id=lehrkraefte:blc:informatik:glf19:glf19#make_the_computer_zimmer_great_again
 +
 Nützliche Tastenkombinationen: Nützliche Tastenkombinationen:
   * F1: Auswahlmodus (zum kopieren, löschen, verschieben, rotieren)   * F1: Auswahlmodus (zum kopieren, löschen, verschieben, rotieren)
-  * F2: Edit-Modus (Manipulation der Pfadelemente.+  * F2: Edit-Modus (Manipulation der Pfadelemente).
  
 Pfad-Manipulationen: Pfad-Manipulationen:
Line 66: 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://stackoverflow.com/questions/7409780/reading-entire-file-in-python
 +<code python>
 +with open('Path/to/file', 'r') as content_file:
 +    content = content_file.read()
 +</code>
 +=== Text finden ===
 +https://www.geeksforgeeks.org/string-find-python/
 +<code python>
 +position = content.find("<path ",startPosition)  # die Startposition ist optional, kann gebraucht werden, um weitere Vorkommen zu finden.
 +if (position!=-1): # Wirklich was gefunden
 +  # tu was damit
 +</code>
 +=== Substring ===
 +<code python>
 +a="0123456789"
 +a[2:5] # -> liefert "234"
 +</code>
 +=== 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(" ")
 +</code>
 +
 +=== Convertierung in Zahlen ===
 +<code python>
 +zahl = float("3.14")
 +</code>
 +
 +
 +<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]=="M":  # Move absolute
 +            x = float(elements[e+1])
 +            y = float(elements[e+2])
 +            e = e+3   # 3 Element konsumiert
 +        elif elements[e]=="m":  # Move relative
 +            x = x + float(elements[e+1])
 +            y = y + float(elements[e+2])
 +            e = e+3   # 3 Element konsumiert
 +
 +
 +
 +with open('text.svg', 'r') as content_file:
 +    content = content_file.read()
 +    
 +# print(content)
 +# Anfangsposition vom path
 +position = content.find("<path")
 +if position<0:
 +    raise BaseException("Kein <path gefunden!")
 +
 +#print("Position %d" % position)
 +# Erste 20 Zeichen vom path
 +#print(content[position:(position+20)])
 +
 +# d=" suchen... (ab der Position position)
 +while True:
 +    position = content.find("d=\"", position)
 +    if position<0:
 +        BaseException("Kein d= gefunden")
 +        
 +    if content[position-1]<'0': # kein Buchstabe vor d
 +        break
 +    
 +    position+=1
 +# Erste 20 Zeichen vom d
 +
 +start = position+3
 +ende = content.find("\"", start)
 +
 +pfaddef = content[start:ende]
 +print(pfaddef)
 +pfaddef = pfaddef.replace(",", " ")
 +print(pfaddef)
 +elemente = pfaddef.split(" ")
 +print(elemente)
 +
 +</code>
 +</hidden>
  
  • kurse/efcomputergrafik/kw48.txt
  • Last modified: 2019/12/04 11:48
  • by Ivo Blöchliger