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 21:24]
Ivo Blöchliger [G-Code für den Plotter]
kurse:efcomputergrafik:kw48 [2019/12/04 11:48]
Ivo Blöchliger
Line 24: Line 24:
  
 Man findet $\vec v(0) = 3(\vec p_1 - \vec p_0)$, also Tangente parallel zu $P_0P_1$. Man findet $\vec v(0) = 3(\vec p_1 - \vec p_0)$, also Tangente parallel zu $P_0P_1$.
-Analog mit $\vec v(1)$.+Analog mit $\vec v(1) = 3(\vec p_3 - \vec p_2)$.
  
-====== Interpolation mit kubischen Funktionen ====== +Mit Maxima: 
-Gesucht ist eine kubische Funktion durch 2 gegebene Punkte $P=(0,y_P)$ und $Q=(1,y_Q)$ mit gegebenen Tangentensteigungen $m_P$ und $m_Qin diesen Punkten.+<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)$$
  
-Variante 1: Ansatz $f(x) = ax^3+bx^2+cx+d$, Gleichungssystem aufstellenlösen.+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 67: 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 75: Line 113:
   * Ctrl-K: Combine (mehrere Pfade in einen Pfad zusammenfassen).    * Ctrl-K: Combine (mehrere Pfade in einen Pfad zusammenfassen). 
  
-===== G-Code für den Plotter ===== +===== Text-Analyse mit Python ===== 
-Der Nullpunkt befindet sich bei den Radien $r_1=r_2=1445$ (in mm). Pro Motorschritt verändern sich die Radien um $\approx 0.0157029$ (mm). Die Motoren haben einen Abstand von 1930 mm.+=== 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
  
-Der G-Code bezieht sich direkt auf die Motorenschritte (was eigentlich gerade nicht der Sinn von G-Code ist).+start = position+3 
 +ende = content.find("\"", start)
  
-Nur G1 (lineare Interpolation) ist implementiert+pfaddef = content[start:ende] 
-  * G1 X-400 Y800  (Gehe zur absoluten Position -400 Schritte (Motor linksund +800 Schritte (Motor rechts). +print(pfaddef
-  * G1 Z0 (Stift hochnicht zeichnen+pfaddef = pfaddef.replace(",", " "
-  * G1 Z1 (Stift runter, zeichnen+print(pfaddef
-Nach jedem Kommando muss auf ein 'OK\n' gewartet werden.+elemente = pfaddef.split(" ") 
 +print(elemente)
  
 +</code>
 +</hidden>
  
  • kurse/efcomputergrafik/kw48.txt
  • Last modified: 2019/12/04 11:48
  • by Ivo Blöchliger