Bezierkurver bruges i computergrafik til at tegne former, til CSS-animation og mange andre steder.
De er en meget enkel ting, der er værd at studere én gang og derefter føle sig tryg i en verden af vektorgrafik og avancerede animationer.
Kontrolpunkter
En bezierkurve er defineret af kontrolpunkter.
Der kan være 2, 3, 4 eller flere.
For eksempel to punkter kurve:
Tre punkter kurve:
Fire punkter kurve:
Hvis man ser nærmere på disse kurver, kan man straks bemærke:
-
Punkterne er ikke altid på kurven. Det er helt normalt, senere skal vi se, hvordan kurven er opbygget.
-
Kurveordenen er lig med antallet af punkter minus et.For to punkter har vi en lineær kurve (det er en ret linje), for tre punkter – en kvadratisk kurve (parabolisk), for fire punkter – en kubisk kurve.
-
En kurve ligger altid inden for det konvekse skrog af kontrolpunkter:
På grund af denne sidste egenskab er det i computergrafik muligt at optimere skæringstests i computergrafik. Hvis konvekse skrog ikke skærer hinanden, så gør kurver det heller ikke. Så hvis man først kontrollerer, om de konvekse skrog skærer hinanden, kan det give et meget hurtigt resultat “intet skæringspunkt”. Det er meget nemmere at kontrollere skæringspunktet for konvekse skrog, fordi de er rektangler, trekanter osv. (se billedet ovenfor), meget enklere figurer end kurven.
Den vigtigste værdi af Bezier-kurver til tegning – ved at flytte punkterne ændres kurven på en intuitivt indlysende måde.
Prøv at flytte kontrolpunkter med musen i eksemplet nedenfor:
Som du kan se, strækker kurven sig langs de tangentielle linjer 1 → 2 og 3 → 4.
Efter lidt øvelse bliver det indlysende, hvordan punkterne skal placeres for at få den ønskede kurve. Og ved at forbinde flere kurver kan vi få stort set hvad som helst.
Her er nogle eksempler:
De Casteljaus algoritme
Der findes en matematisk formel for Bezier-kurver, men lad os behandle den lidt senere, forDe Casteljaus algoritme er identisk med den matematiske definition og viser visuelt, hvordan den er konstrueret.
Først skal vi se 3-punkts-eksemplet.
Her er demoen, og forklaringen følger.
Kontrolpunkterne (1,2 og 3) kan flyttes med musen. Tryk på “play”-knappen for at køre den.
De Casteljaus algoritme til opbygning af 3-punkts bezier-kurven:
-
Tegn kontrolpunkter. I demonstrationen ovenfor er de mærket:
1
,2
,3
. -
Byg segmenter mellem kontrolpunkterne 1 → 2 → 3. I demoen ovenfor er de brune.
-
Parameteren
t
flyttes fra0
til1
. I eksemplet ovenfor anvendes trin0.05
: løkken går over0, 0.05, 0.1, 0.15, ... 0.95, 1
.For hver af disse værdier af
t
:-
På hvert brunt segment tager vi et punkt, der ligger på den afstand, der er proportional med
t
, fra dets begyndelse. Da der er to segmenter, har vi to punkter.For eksempel, for
t=0
– vil begge punkter være i begyndelsen af segmenterne, og fort=0.25
– på 25% af segmentets længde fra begyndelsen, fort=0.5
– 50%(midten), fort=1
– i slutningen af segmenterne. -
Forbind punkterne. På billedet nedenfor er det forbindende segment malet blåt.
-
For t=0.25 |
For t=0.5 |
---|---|
-
Nu tager man i det blå segment et punkt på den afstand, der er proportional med samme værdi af
t
. Det vil sige, fort=0.25
(det venstre billede) har vi et punkt i slutningen af den venstre fjerdedel af segmentet, og fort=0.5
(det højre billede) – i midten af segmentet. På billederne ovenfor er dette punkt rødt. -
Da
t
løber fra0
til1
, tilføjer hver værdi aft
et punkt til kurven. Mængden af sådanne punkter udgør Bezier-kurven. Den er rød og parabolisk på billederne ovenfor.
Det var en proces for 3 punkter. Men det samme er for 4 punkter.
Demoen for 4 punkter (punkterne kan flyttes med musen):
Algoritmen for 4 punkter:
- Forbind kontrolpunkterne ved hjælp af segmenter: 1 → 2, 2 → 3, 3 → 4. Der vil være 3 brune segmenter.
- For hvert
t
i intervallet fra0
til1
:- Vi tager punkter på disse segmenter på den afstand, der er proportional med
t
fra begyndelsen. Disse punkter er forbundet, således at vi har to grønne segmenter. - På disse segmenter tager vi punkter proportionale med
t
. Vi får et blåt segment. - På det blå segment tager vi et punkt, der er proportionalt med
t
. På eksemplet ovenfor er det rødt.
- Vi tager punkter på disse segmenter på den afstand, der er proportional med
- Disse punkter danner tilsammen kurven.
Algoritmen er rekursiv og kan generaliseres til et vilkårligt antal kontrolpunkter.
Givet N af kontrolpunkter:
- Vi forbinder dem for at få oprindeligt N-1 segmenter.
- Derpå tager vi for hvert
t
fra0
til1
et punkt på hvert segment på afstanden proportional medt
og forbinder dem. Der vil være N-2 segmenter. - Gentag trin 2, indtil der kun er ét punkt.
Disse punkter udgør kurven.
Kør og sæt eksemplerne på pause for tydeligt at se segmenterne, og hvordan kurven er opbygget.
En kurve, der ser ud som y=1/t
:
Zig-zag-kontrolpunkter fungerer også fint:
Det er muligt at lave en sløjfe:
En ikke-glat Bezier-kurve (ja, det er også muligt):
Hvis der er noget uklart i algoritmebeskrivelsen, kan du se på de levende eksempler ovenfor for at se, hvordan kurven er opbygget.
Da algoritmen er rekursiv, kan vi opbygge Bezier-kurver i en hvilken som helst rækkefølge, dvs.: ved hjælp af 5, 6 eller flere kontrolpunkter. Men i praksis er mange punkter mindre nyttige. Normalt tager vi 2-3 punkter, og for komplekse linjer limer vi flere kurver sammen. Det er enklere at udvikle og beregne.
For at specificere en Bezier-kurve bruges kontrolpunkter. Som vi kan se, ligger de ikke på kurven, bortset fra det første og det sidste.
Sommetider har vi en anden opgave: at tegne en kurve gennem flere punkter, så de alle ligger på en enkelt glat kurve. Den opgave kaldes interpolation, og her behandler vi den ikke.
Der findes matematiske formler for sådanne kurver, f.eks. Lagrange-polynomium. I computergrafik bruges spline-interpolation ofte til at opbygge glatte kurver, der forbinder mange punkter.
Matematik
En Bezier-kurve kan beskrives ved hjælp af en matematisk formel.
Som vi så – er der faktisk ingen grund til at kende den, de fleste tegner bare kurven ved at flytte punkter med en mus. Men hvis du er til matematik – så er den her.
Givet koordinaterne for kontrolpunkterne Pi
: det første kontrolpunkt har koordinaterne P1 = (x1, y1)
, det andet: P2 = (x2, y2)
osv. beskrives kurvens koordinater ved ligningen, der afhænger af parameteren t
fra segmentet .
-
Formlen for en 2-punkts kurve:
P = (1-t)P1 + tP2
-
For 3 kontrolpunkter:
P = (1−t)2P1 + 2(1−t)tP2 + t2P3
-
For 4 kontrolpunkter:
P = (1−t)3P1 + 3(1−t)2tP2 +3(1−t)t2P3 + t3P4
Dette er vektorgensætninger. Vi kan med andre ord sætte x
og y
i stedet for P
for at få de tilsvarende koordinater.
For eksempel er 3-punktskurven dannet af punkterne (x,y)
beregnet som:
x = (1−t)2x1 + 2(1−t)tx2 + t2x3
y = (1−t)2y1 + 2(1−t)ty2 + t2y3
I stedet for x1, y1, x2, y2, x3, y3
skal vi sætte koordinaterne for 3 kontrolpunkter, og når t
så bevæger sig fra 0
til 1
, vil vi for hver værdi af t
få (x,y)
af kurven.
Til eksempel, hvis kontrolpunkterne er (0,0)
, (0.5, 1)
og (1, 0)
, bliver ligningerne:
x = (1−t)2 * 0 + 2(1−t)t * 0.5 + t2 * 1 = (1-t)t + t2 = t
y = (1−t)2 * 0 + 2(1−t)t * 1 + t2 * 0 = 2(1-t)t = –2t2 + 2t
Nu, da t
løber fra 0
til 1
, danner mængden af værdier (x,y)
for hver t
kurven for sådanne kontrolpunkter.
Resumé
Bezier-kurver er defineret af deres kontrolpunkter.
Vi så to definitioner af Bezier-kurver:
- Ved hjælp af en tegningsproces: De Casteljau’s algoritme.
- Anvendelse af en matematisk formel.
Gode egenskaber ved Bezier-kurver:
- Vi kan tegne glatte linjer med en mus ved at flytte kontrolpunkter.
- Komplekse former kan laves af flere Bezier-kurver.
Anvendelse:
- I computergrafik, modellering, vektorgrafikredigering. Skrifttyper beskrives ved hjælp af Bezier-kurver.
- I webudvikling – til grafik på Canvas og i SVG-formatet. I øvrigt er “levende” eksempler ovenfor skrevet i SVG. De er faktisk et enkelt SVG-dokument, der får forskellige punkter som parametre. Du kan åbne det i et separat vindue og se kilden: demo.svg.
- I CSS-animation til at beskrive animationens bane og hastighed.