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
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, gerade Segmente definieren zu können. Ein Segment trägt den Index der ersten Steigung. D.h. Wenn das Segment $i$ linear sein soll, dann sind $m_i$ und $m_{i+1}$ gegeben und zwar als $(x_{i+1}-x_{i})$. Die Einträge in der Matrix ändern sich dann für die Zeilen $i$ und $i+1$ wie folgt:
 +
 +\[
 +\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,i}=-1$ und $X_{i,i+1}=1$.
 +
  
 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("./vector")
 +from vector import Vector
 +
 +class Bezier:
 +    
 +    def __init__(self,pts):
 +        if len(pts)==4:
 +            self.pts = [p.copy() for p in pts]
 +        if len(pts)==3:
 +            self.pts = [pts[0].copy(), 1/3*pts[0]+2/3*pts[1], 1/3*pts[2]*2/3*pts[1], pts[2].copy()]
 +        if len(pts)==2:
 +            self.pts = [pts[0].copy(), 2/3*pts[0]+1/3*pts[1], 1/3*pts[0]+2/3*pts[1], pts[1].copy()]
 +        
 +    # Punkt für Parameter t (in [0,1])        
 +    def x(self,t):
 +        return (1.0-t)**3*self.pts[0]+\
 +               3*(1.0-t)**2*t*self.pts[1]+\
 +               3*(1.0-t)*t**2*self.pts[2]+\
 +               t**3*self.pts[3]
 +
 +    # Geschwindigkeit (dx/dt) in t-Parametrierung
 +    def v(self,t):
 +        return -3*(1.0-t)**2*self.pts[0]+\
 +               3*(1.0-4*t+3*t**2)*self.pts[1]+\
 +               3*(2*t-3*t**2)*self.pts[2]+\
 +               3*t**2*self.pts[3]
 +
 +   
 +    # Zeichnet den Spline
 +    # Achtung: Funktioniert nur, wenn diese Datei ausgeführt wird...
 +    def draw(self, steps=1000):
 +        move(self.pts[0][0], self.pts[0][1]);
 +        for i in range(1,steps+1):
 +            p = self.x(1.0*i/steps)
 +            lineTo((p[0],p[1]))
 +                        
 +
 +if __name__== "__main__":
 +    from gpanel import *
 +    makeGPanel(Size(600,600))
 +    window(0, 599, 0, 599)
 +    b = Bezier([Vector([100,500,0]), Vector([200,0,0]), Vector([300,300,0]), Vector([500,300,0])])
 +    b.draw()
 +    
 +            
 +                              
 +</code>
  • kurse/efcomputergrafik/kw3.1579113580.txt.gz
  • Last modified: 2020/01/15 19:39
  • by Ivo Blöchliger