kurse:efcomputergrafik:kw48

This is an old revision of the document!


Algebraische Form

Bestimmen Sie die algebraische Form der Bezierkurven von Grad 1,2,3 (und $n$, wer möchte), und zwar als konvexe Kombination der Kontrollpunkte mit den Koeffizienten als vollständig faktorisierte Polynome in $t$.

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 $$

$$ 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 $$

Man findet $\vec v(0) = 3(\vec p_1 - \vec p_0)$, also Tangente parallel zu $P_0P_1$. Analog mit $\vec v(1) = 3(\vec p_3 - \vec p_2)$.

Mit 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));

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$$

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):

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(%);

liefert: $$b\,t+a\,\left(1-t\right)$$

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:

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(%);

liefert: $$c\,t^2-2\,b\,\left(t-1\right)\,t+a\,\left(t-1\right)^2$$

Analyse von SVG-Pfaden

Vorgehen

Ziel:

SVG-Datei mit Inkscape erstellen → Python Programm das die Pfade ausliest → Konvertieren in Polygonzug → Umrechnen in Plotter-Koordinaten → Plotter Befehle → WhiteBoard verschönern.

Wäre cool:

  • Umgang mit Inkscape (erstellen von Pfaden)
  • Analyse der SVG-Datei
    • Welche Pfad-Element müssen implementiert werden, wie funktionieren diese?
    • Text-Analyse, Konvertierung der Daten in Python
  • Bezier-Klasse erstellen (für Kurven von Grad 1 bis 3).
    • Initialisierung
    • Zeichnen (Validierung)
    • Interpolation
  • Pfad-Klasse erstellen
    • Als Sammlung von Bezier-Kurven
  • Plotter Koordinatensystem analysieren
    • Geometrische Definition
    • Ausmessen im Tech-Lab
    • Nullpunkt festlegen
  • Plotter Sprache definieren
    • Koordinaten
    • Stift auf/ab
  • Arduino-Code anpassen

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:

  • F1: Auswahlmodus (zum kopieren, löschen, verschieben, rotieren)
  • F2: Edit-Modus (Manipulation der Pfadelemente).

Pfad-Manipulationen:

  • Shift-Ctrl-C: Object to Path (Kreise, Rechtecke, Text wird erst *nicht* als Pfad gespeichert.) Bei Text ist danach noch eine Gruppe aufzulösen.
  • Ctrl-K: Combine (mehrere Pfade in einen Pfad zusammenfassen).

Datei einlesen

Von https://stackoverflow.com/questions/7409780/reading-entire-file-in-python

with open('Path/to/file', 'r') as content_file:
    content = content_file.read()

Text finden

https://www.geeksforgeeks.org/string-find-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

Substring

a="0123456789"
a[2:5] # -> liefert "234"

Text Analyse

Ist der Path-String einmal gefunden, geht es darum, diesen zu analysieren. Als erster Schritt soll dieser nach Leerschlägen aufgeteilt werden:

txt = "foo bar baz boo"
items = txt.split(" ")

Convertierung in Zahlen

zahl = float("3.14")

converter.py

converter.py

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)
  • kurse/efcomputergrafik/kw48.1575456487.txt.gz
  • Last modified: 2019/12/04 11:48
  • by Ivo Blöchliger