B-Splines

Moderators: dirkwb, Xilvo

Forumregels
(Middelbare) school-achtige vragen naar het forum "Huiswerk en Practica" a.u.b.
Zie eerst de Huiswerkbijsluiter
Reageer
Gebruikersavatar
Berichten: 71

B-Splines

Ik ben de laatste tijd met B-Splines bezig geweest, maar er zit iets raars in de theorie waar ik niet helemaal uit kom.
 
Een B-Spline curve gaat door de begin- en eindcontrolepunten heen als de eerste en laatste knopen in de knot vector d keer herhaald worden, waarbij d de graad van de B-Splines is. Dit is al het eerste punt waarop het misgaat, want verschillende bronnen noemen verschillende aantallen zelfs als in aanmerking genomen wordt dat sommigen de graad van de B-Splines nemen en sommigen 1 hoger dan dat voor het algoritme (twee voorbeelden, pagina 17-18 en 47 respectievelijk). Na dit uitgetest te hebben lijkt de knoop d+1 keer voor te moeten komen in de knot vector met de bovengenoemde definitie voor d.
 
Er is echter nog een probleem. Neem bijvoorbeeld een simpele B-Spline curve van graad 1 en 3 controlepunten met knot vector [0, 0, 1, 2, 2]. Deze zou dus door de eerste 2 controlepunten heen moeten gaan, maar dit is niet wat uit de recurrence komt (zie eerste link pagina 17)
 
Voor het eerste punt hebben we t=0, d=1 en k=0 aangenomen dat de indices van de knot vector bij 0 beginnen. x/0 = arbitrary, meestal 0 voor snellere evaluatie.
B0,1(0) = (0 - 0) / (0 - 0) * B0,0(0) + (1 - 0) / (1 - 0) * B1,0(0) = 0 + 1 = 1
B1,1(0) = (0 - 0) / (1 - 0) * B1,0(0) + (2 - 0) / (2 - 1) * B2,0(0) = 0 + 0 = 0
B2,1(0) = (0 - 1) / (2 - 1) * B2,0(0) + (2 - 0) / (2 - 2) * B3,0(0) = 0 + 0 = 0
 
So far so good, maar het loopt iets anders bij het laatste control point
 
B0,1(2) = (2 - 0) / (0 - 0) * B0,0(2) + (1 - 2) / (1 - 0) * B1,0(2) = 0 + 0 = 0
B1,1(2) = (2 - 0) / (1 - 0) * B1,0(2) + (2 - 2) / (2 - 1) * B2,0(2) = 0 + 0 = 0
B2,1(2) = (2 - 1) / (2 - 1) * B2,0(2) + (2 - 2) / (2 - 2) * B3,0(2) = 0 + 0 = 0
 
Zoals je ziet bereikt de curve het laatste controlepunt nooit omdat het altijd naar 0 evalueert. Dit komt doordat de evaluatie van Bk,d(t) voor d=0 vereist dat tk <= t < tk+1 om als 1 te evalueren en 0 neemt anders. Doordat t bij het laatste controlepunt vanwege het herhalen van de controlepunten gelijk is aan de hoogste knoop kan t < tk+1 nooit waar zijn waardoor dit altijd naar 0 evalueert. De < veranderen in <= is geen oplossing omdat dit voor vreemde situaties zorgt bij de middelste controlepunten. Bijvoorbeeld:
 
B0,1(1) = (1 - 0) / (0 - 0) * B0,0(1) + (1 - 1) / (1 - 0) * B1,0(1) = 0 + 0 = 0
B1,1(1) = (1 - 0) / (1 - 0) * B1,0(1) + (2 - 1) / (2 - 1) * B2,0(1) = 1 + 1 = 2
B2,1(1) = (1 - 1) / (2 - 1) * B2,0(1) + (2 - 1) / (2 - 2) * B3,0(1) = 0 + 0 = 0
 
Wat ervoor zorgt dat de curve voorbij het tweede controlepunt schiet alvorens weer naar de normale curve terug te keren, wat de curve een bizarre "stekel" geeft wat duidelijk niet de bedoeling is.
 
Nu is mijn vraag: wat gaat hier verkeerd? Ik moet haast wel iets verkeerd geinterpreteerd hebben, maar ik kom er niet uit wat. Ik heb dit ook uitgeprobeerd met andere formules die bij andere definities van d en andere hoeveelheden herhaalde knopen (1 herhaalde knoop minder gaat bij d=1 nog goed maar daarna niet meer) en ik krijg er steeds ongewenste resultaten uit of dezelfde als hier gedemonstreerd zijn.
Veni, Vidi, Cecidi

(Ik kwam, ik zag, ik viel dood neer)

(PM me voor meer grappige combinaties!)

Reageer