Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
kurse:efcomputergrafik:kw3 [2020/01/15 19:39] Ivo Blöchliger [Variante mit variablen Interallen $[0,a_i]$ anstatt [0,1]] |
kurse:efcomputergrafik:kw3 [2020/03/04 09:21] (current) Ivo Blöchliger [Lineare Abschnitte mit bekannter Steigung] |
||
---|---|---|---|
Line 92: | Line 92: | ||
\end{pmatrix} | \end{pmatrix} | ||
\] | \] | ||
+ | |||
+ | ====== Lineare Abschnitte mit bekannter Steigung ====== | ||
+ | Es ist wünschenswert, | ||
+ | |||
+ | \[ | ||
+ | \left(0 \ldots 0 \quad 1 \quad 0\ldots 0\right) \cdot \vec m = (0 \ldots 0 \quad -1 \quad 1 \quad 0 \ldots 0) \cdot \vec x | ||
+ | \] | ||
+ | mit $M_{i,i} = 1$ und $X_{i, | ||
+ | |||
In Python (hier Blender Code) sieht das dann z.B. wie folgt aus: | In Python (hier Blender Code) sieht das dann z.B. wie folgt aus: | ||
Line 285: | Line 294: | ||
* | * | ||
+ | <code python bezier2.py> | ||
+ | # -*- coding: utf-8 -*- | ||
+ | # import importlib | ||
+ | # importlib.import_module(" | ||
+ | from vector import Vector | ||
+ | |||
+ | class Bezier: | ||
+ | | ||
+ | def __init__(self, | ||
+ | if len(pts)==4: | ||
+ | self.pts = [p.copy() for p in pts] | ||
+ | if len(pts)==3: | ||
+ | self.pts = [pts[0].copy(), | ||
+ | if len(pts)==2: | ||
+ | self.pts = [pts[0].copy(), | ||
+ | | ||
+ | # Punkt für Parameter t (in [0, | ||
+ | def x(self,t): | ||
+ | return (1.0-t)**3*self.pts[0]+\ | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | # Geschwindigkeit (dx/dt) in t-Parametrierung | ||
+ | def v(self,t): | ||
+ | return -3*(1.0-t)**2*self.pts[0]+\ | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | |||
+ | # Zeichnet den Spline | ||
+ | # Achtung: Funktioniert nur, wenn diese Datei ausgeführt wird... | ||
+ | def draw(self, steps=1000): | ||
+ | move(self.pts[0][0], | ||
+ | for i in range(1, | ||
+ | p = self.x(1.0*i/ | ||
+ | lineTo((p[0], | ||
+ | | ||
+ | |||
+ | if __name__== " | ||
+ | from gpanel import * | ||
+ | makeGPanel(Size(600, | ||
+ | window(0, 599, 0, 599) | ||
+ | b = Bezier([Vector([100, | ||
+ | b.draw() | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ |