IZG Nadpis Lab 04 1 Zobrazování 2D Nadpis křivek 2 Nadpis 3 Pavel JménoSvoboda Příjmení VysokéVysoké učení technické učení technické v Brně,vFakulta Brně, Fakulta informačních informačních technologií technologií v Brně Božetěchova 2, 612 66 Brno
[email protected] [email protected]
99.99.2008 18.03.2013
Obsah • • • •
Úvodní část Rekapitulace 2D křivek Fergusnova kubika Bézierova křivka • Výpočet pomocí Bernstein polynomů • Racionální křivka
• Výpočet pomocí algoritmu De Casteljau • Neracionální
IZG Lab 04 - Zobrazování 2D křivek
2
Rekapitulace 2D křivek • Vyjádření křivek • Explicitní, Implicitní • Parametrické
• Použití 2D křivek • • • • •
Definice fontů Šablonování Definice objektů Animační křivky …
[F. Alexandr]
IZG Lab 04 - Zobrazování 2D křivek
3
Typy křivek • Aproximační • Interpolační • Racionální • váhové koeficienty řídících bodů
• Neracionální • váhové koeficienty rovny 1
[F. Alexandr]
IZG Lab 04 - Zobrazování 2D křivek
4
Fergusnova kubika • Interpolační křivka • Definována • 2 koncovými body • 2 tečnými vektory
• Neintuitivní ovládání • Nelokální změna tvaru • Počítá se pomocí polynomů • Hermitovy polynomy
IZG Lab 04 - Zobrazování 2D křivek
5
Bézierova křivka • Její první užití se datuje do 60tých let – CAD aplikace • Automobilový design
• TrueType i Postcript písma • Parametrické vyjádření • řád polynomu = stupeň křivky je počet řídících bodů křivky - 1
• Aproximační křivka • Vždy ale prochází prvním a koncovým kontrolním bodem
• Racionální vs Neracionální
IZG Lab 04 - Zobrazování 2D křivek
6
Bézierova křivka – výpočet pomocí polynomů • Stupeň křivky = Řád polynomu = Řídících bodů -1 • Racionální X Neracionální • Neracionální: váhové hodnoty = 1 • Racionální: Váhové hodnoty obecně jakékoli
• Parametrické vyjádření
n
n
Q t Pi Rin t i 0
• B – Bernsteinův polynom
n P B i i i t i0 n
B t i
n i
i 0
n n i Bin t t i 1 t , t 0,1 , i 0, i
,n
• t – parametr křivky <0;1> • n – řád polynomu • i – index řídícího bodu IZG Lab 04 - Zobrazování 2D křivek
7
Bézierova kubika 1 3 3 3 6 3 Q t T 3 3 0 0 0 1
• Bézierova kubika • Počet řídících bodů = 4 • P0, P1, P2, P3
• T = [t3, t2, t1 , t0 = 1]
1 P0 0 P1 0 P2 0 P3
B03 t 1 t
3
B13 t 3t 1 t
2
B23 t 3t 2 1 t B33 t t 3 3
Q t P0 B t P1 B t P2 B t P3 B t Pi Bi3 t 3 0
3 1
3 2
3 3
i 0
IZG Lab 04 - Zobrazování 2D křivek
8
Bézierova křivka – algoritmus De Casteljau • Rekurzivní algoritmus • Výpočet Neracionální Bézierovy křivky 𝑗
𝑗−1
𝑃𝑖 = (1 − 𝑡) 𝑃𝑖 𝑃10
𝑃00 lirp
𝑃01
𝑗−1 𝑗 = 1 … 𝑛; 𝑖 = 0 … 𝑛 − 𝑗
+ 𝑡𝑃𝑖+1
lirp
lirp
𝑃02
𝑃30
𝑃20 lirp
𝑃11
lirp
lirp
𝑃12
𝑃21
Bod na křivce 𝑃03
lirp = lineární interpolace IZG Lab 04 - Zobrazování 2D křivek
9
Bézierova křivka – implementace De Casteljau • Základní implementace: • Iterujeme přes parametr t <0;1> • Iterace přes všechny úrovně rekurze • Iterace přes veškeré kontrolní body v dané úrovni a jejich postupný výpočet
if(n < 1) return; n = kontrolnich bodu-1; for(int q = 0; q <= quality; ++q, t+=t_step) { Copy of input vector in to local vector of points for(int j = 0; j < n; ++j) for(int i = 0; i < n-j; ++i) { Výpočet bodu i v úrovni j {
}
IZG Lab 04 - Zobrazování 2D křivek
10
Samostatná práce • Implementace Bézierovy křivky • Buď De Casteljau – neracionální křivka • Anebo Pomocí Bernsteinových polynomů – racionální křivka
IZG Lab 04 - Zobrazování 2D křivek
11
Cvičení - rozhraní • Soubory • student.h – deklarace funkcí, které programujete • student.c – zde pište Váš kód void bezierDeCasteljau(int quality, const S_Vector *points, S_Vector *line_points) void bezierBernsteinPolynom(int quality, const S_Vector *points,S_Vector *line_points)
• base.h – definice struktury Point2D typedef struct Point2d { double x; double y; double weight; }Point2d;
IZG Lab 04 - Zobrazování 2D křivek
12
Cvičení vector.h • Vektor je typu S_Vector •
•
USE_VECTOR_OF(Point2d, point2d_vec) • Vygeneruje funkce s předponou point2d_vec pro práci s vektorem S_Vector prvků typu Point2d #define point2d_vecGet(pVec, i) (*point2d_vecGetPtr((pVec), (i))) •
Definice makra pro získání i-tého prvku s vektoru pVec
•
S_Vector* vector = point2d_vecCreateEmpty() – vytvoří prázdný vektor pro prvky typu Point2d
•
point2d_vecSize(pVec) – vrátí velikost vektoru
•
point2d_vecGetPtr(pVec, i) – ukazatel na i-tý prvek vektoru pVec
•
point2d_vecPushBack(pVec, p) – vloží na konec vektoru pVec prvek p
•
point2d_vecSet(pVec, i, p) – vloží prvek p do vektoru pVec na index i
•
point2d_vecRelease(&pVec) vs point2d_vecClean(pVec) – zruší kompletně celý vektor pVec – již s ním nelze pracovat vs smaže prvky vektoru – vektor je prázdný o velikosti 0
•
Další funkce viz vector.h IZG Lab 04 - Zobrazování 2D křivek
13
C’est la fin.
IZG Lab 04 - Zobrazování 2D křivek
14