Dit is een wellicht simpelere uitleg:
Knutselsmurf heeft het over 2d curves, maar in principe zijn ze er in elke dimensie. Een n-dimensionale curve is eigenlijk gewoon n aparte curves voor elke dimensie.
Bezier curves zijn er in verschillende gradaties. Een lineaire bezier heeft 2 control points, en is eigenlijk gewoon een lineaire interpolatie van punt 1 naar punt 2. Dus zeg maar
[i]x(t) = x
0 * (1 - t) + x
1 * t
x
0 en x
1 zijn hier de control points, en t ligt in het bereik [0, 1]
Laat ik bovenstaande vergelijking even op een generieke manier herschrijven als
x(t) = lerp (x0, x1, t)
waarbij lerp staat voor
llinear int
erpolation (dit is een veelgebruikte term hiervoor), en dus eigenlijk gewoon interpoleert tussen de 2 punten aan de hand van t
Een quadratische bezier heeft 3 control points, de lijn wordt dan getrokken tussen het begin en eindpunt (dat is altijd het geval bij beziers), en de lijn begint in de richting van het 2e punt te gaan, en aan het eind heeft ie ook de richting van punt 2 naar punt 3. Deze bezier is gedefinieerd als een combinatie van lineare interpolaties:
a = lerp (x0, x1, t)
b = lerp (x1, x2, t)
x(t) = lerp (a, b, t)
De kubieke bezier, de meest gebruikte, heeft 4 control points, en is gedefinieerd als
a = lerp (x0, x1, t)
b = lerp (x1, x2, t)
c = lerp (x2, x3, t)
p = lerp (a, b, t)
q = lerp (b, c, t)
x(t) = lerp (p, q, t)
In het algemeen interpoleer je dus steeds tussen alle control points naar een set nieuwe control points (je hebt er dan 1 minder over), en dat doe je net zo lang tot je er nog maar 1 overhoudt
Maar zoals ik al zei, een bezier begint bij het eerste punt, en eindigt bij het laatste, en de punten die ertussenin liggen bepalen hoe de curve zich gedraagt tussen deze punten. Maar ze gaan niet door deze punten.
Dit in tegenstelling tot de catmull-rom curve, die ook kubiek is en dus 4 control points heeft. De curve begint bij het 2e en eindigt bij het 3e punt, en het 1e en 4e bepalen de start en eindrichting van de curve. Maar nu komt het handige hieraan: Als je er een 5e controlpoint bijpakt, en je tekent eerst een curve over de punten 1 t/m 4, en daarna eentje over de punten 2 t/m 5, dan krijg je een vloeiende lijn
Je kunt zo'n curve in jouw voorbeeld gewoon definieren met de punten 1 t/m 4, en de daadwerkelijke lijn die getekend wordt is het stukje van 2 naar 3. Om het stukje van 3 naar 4 te tekenen gooi je punt 1 dus weg, en plak je het volgende punt erachter. Zo kun je door je hele grafiek heengaan, en hoef je ook niet moelijk te doen om tussenliggende controlpoints uit te rekenen, zoals dat bij een bezier wel moet.
Ik zal even de definitie van de catmull-rom curve opzoeken, moment
.edit:
a = 2 * x1 - f * (x0 - x1 - x2 - x3)
b = f * (2 * x0 + x1 - 2 * x2 - x3) - 3 * (x1 - x2)
c = f * (x2 - x0)
d = x1
x(t) = a*t3 + b*t2 + c*t + d
(
Of met Horner's rule, minder vermenigvuldigingen en dus sneller:
x(t) = ((a * t + b ) * t + c) * t + d
)
.edit: oh, vergeet ik nog bij te zeggen: de f in deze is een soort van "curvyness" parameter, daarmee kun je bepalen hoe vloeiend de lijn loopt. Ik geloof dat een f van 1 of 0.5 de standaard catmull-rom geeft
[
Voor 45% gewijzigd door
.oisyn op 20-02-2004 23:06
]