Splines Verständnisfragen
Verfasst: 09.03.2023 13:05
Vorab: ich weis was Splines sind, wozu man sie benötigt und hab eine Grundahnung von der Mathematik, die dahinter steht.
Ich hab aber als erstes mal Schwierigkeiten mit den Spline-Typen
B-Spline (Basis Spline) - Was ist das??
C-Spline (Cubic Spline) - ist das das gleiche wie Cubic Bezier??
Bezier-Spline/Curve in Cubic, Quadratic
allegemeine Bezier höher Ordung - wird anscheinend auch verwendet
Ich hab viel Code gesehen, der aber so verschachtelt ist, dass man nicht wirklich durchblickt und die Essenz davon rausbekommt.
Ich wusste, dass es sich bei einem Teil der Berechnungen um Vector-Produke bzw. Vector-Matrix Produkte zur Berechnung handeln muss!
Bei rosettacode.org, hab ich dann was gefunden, wo man das genau so sehen kann. Ich hab das als Brainstroming füür PB aufbereitet
Jetzt dazu noch ein paar Fragen zu den Prameterfunktion und Tabellen:
1. Die AllBernstein Faktoren zur Gewichtung der Splines
hier versteh ich schon nicht, was Gewichtung bedeuted!
Für welche Spline-Typen benötigt man das
2. Die BinomialCoefficient aus den Fakultäten, soweit noch klar was das ist.
für welche Splines benötigt man das?
Mein Problem ist, dass ich von diesen Parametern im Code für die Cubic und Qudaratic Bezier nicht erkennen kann!
3. Cubic Spline Interpolation wird duch 4 Punkte bestimmt, Quadratic durch 3
wenn der Spline mehr Punkte hat, wo muss ich dann bei der Interolation des 2ten Segment ansetzen?
- beim 2ten Punkt?
- beim letzten Punkt des vorherigen Segments?
- beim Folgepunkt nach dem 1 Segment?
Kann mir da jemand etwas Licht ins Dunkel bringen?
Ich hab aber als erstes mal Schwierigkeiten mit den Spline-Typen
B-Spline (Basis Spline) - Was ist das??
C-Spline (Cubic Spline) - ist das das gleiche wie Cubic Bezier??
Bezier-Spline/Curve in Cubic, Quadratic
allegemeine Bezier höher Ordung - wird anscheinend auch verwendet
Ich hab viel Code gesehen, der aber so verschachtelt ist, dass man nicht wirklich durchblickt und die Essenz davon rausbekommt.
Ich wusste, dass es sich bei einem Teil der Berechnungen um Vector-Produke bzw. Vector-Matrix Produkte zur Berechnung handeln muss!
Bei rosettacode.org, hab ich dann was gefunden, wo man das genau so sehen kann. Ich hab das als Brainstroming füür PB aufbereitet
Code: Alles auswählen
;SPLINE Brainstorming!!!
; https://rosettacode.org/wiki/Bitmap/B%C3%A9zier_curves/Cubic
; https://rosettacode.org/wiki/Bitmap/B%C3%A9zier_curves/Quadratic
EnableExplicit
Structure TPoint2D
X.d
Y.d
EndStructure
Procedure _AllBernstein(n.i, u.d, Array AB.d(1))
; https://www.uni-ulm.de/fileadmin/website_uni_ulm/mawi.inst.070/ws15_16/AngewandteNumerik2/Vorlesungsskript/2015_08_19_AngNumerik2.pdf
; berechnet die AllBernstein Faktoren zu Gewichtung von B-Splines
Protected.i I, K
Protected.d u1, saved, temp
ReDim AB.d(n - 1)
AB(0) = 1.0
u1 = 1 - u
For I = 1 To n - 1
saved = 0
For K = 0 To I - 1
temp = AB(K)
AB(K) = saved + u1 * temp
saved = u * temp
Next
AB(I) = saved
Next
EndProcedure
Procedure.d _BinomialCoefficient(N.i, K.i)
; Binomialkoeffizient
; https://rosettacode.org/wiki/Evaluate_binomial_coefficients#Ada
; This is a port of the ADA Example because it uses a very effective
; way to calcualte the result without calculating explicite N! K!
; N!
; BinomialCoefficient = -----------------
; ((N - K)! * K!)
Protected.i I, M
Protected.d ret=1.0
If N>K
If K>=1
If K > N/2 ; Use symmetry
M=N-K
Else
M=K
EndIf
For I = 1 To M
ret= ret * ((N-M+I)/I)
Next I
EndIf
EndIf
ProcedureReturn ret
EndProcedure
Procedure Cubic_Bezier(Array PtOut.TPoint2D(1), *P1.TPoint2D, *P2.TPoint2D, *P3.TPoint2D, *P4.TPoint2D, Color.l=$FFFFFF, N = 20)
Protected I
Protected.d T, T1, A, B, C, D
For I = 1 To N ;??? For I in Points'Range loop
T = I/N
T1= 1.0 -T
A = T1 *T1 * T1 ; A= (1.0-T)^3
B = 3.0 * T * T1*T1 ; B= 3*T*(1-T)^2
C = 3.0 * T*T * T1 ; C= 3*T^2 *(1-T)
D = T*T*T ; D= T^3
PtOut(I)\X = A * *P1\X + B * *P2\X + C * *P3\X + D * *P4\X
PtOut(I)\Y = A * *P1\Y + B * *P2\Y + C * *P3\Y + D * *P4\Y
Next
For I =1 To N-1 ; in Points'First..Points'Last - 1 loop
LineXY(PtOut(I)\X, PtOut(I)\Y, PtOut(I+1)\X, PtOut(I+1)\Y, Color)
Next
EndProcedure
Procedure Quadratic_Bezier(Array PtOut.TPoint2D(1), *P1.TPoint2D, *P2.TPoint2D, *P3.TPoint2D, Color.l=$FFFFFF, N = 20)
Protected I
Protected.d T, T1, A, B, C
ReDim PtOut(N)
For I = 1 To N ;??? For I in Points'Range loop
T = I/N
T1= 1.0 -T
A = T1 * T1 ; A = (1-T)^2
B = 2.0 * T * T1 ; B = 2 *T *(1.0 - T);
C = T*T ; T^2
PtOut(I)\X = A * *P1\X + B * *P2\X + C * *P3\X
PtOut(I)\Y = A * *P1\Y + B * *P2\Y + C * *P3\Y
Next
For I = 1 To N-1 ; in Points'First..Points'Last - 1 loop
LineXY(PtOut(I)\X, PtOut(I)\Y, PtOut(I+1)\X, PtOut(I+1)\Y, Color)
Next
EndProcedure
1. Die AllBernstein Faktoren zur Gewichtung der Splines
hier versteh ich schon nicht, was Gewichtung bedeuted!
Für welche Spline-Typen benötigt man das
2. Die BinomialCoefficient aus den Fakultäten, soweit noch klar was das ist.
für welche Splines benötigt man das?
Mein Problem ist, dass ich von diesen Parametern im Code für die Cubic und Qudaratic Bezier nicht erkennen kann!
3. Cubic Spline Interpolation wird duch 4 Punkte bestimmt, Quadratic durch 3
wenn der Spline mehr Punkte hat, wo muss ich dann bei der Interolation des 2ten Segment ansetzen?
- beim 2ten Punkt?
- beim letzten Punkt des vorherigen Segments?
- beim Folgepunkt nach dem 1 Segment?
Kann mir da jemand etwas Licht ins Dunkel bringen?