Curbe Si Suprafete Bezier
Prefață
Modelarea geometrica este un instrument de bază în inginerie și în știință. Fundamentată ca o ramură nouă a informaticii și matematicii impusă de deyvoltarea tehnologiei calculatoarelor, modelarea geometrică (cunoscută și sub numele de Computer Aided Geometric Design sau prescurtat CAGD) este o geometrie bayată pe calculator.
Primul beneficiar al tehnicilor CAGD a fost industria constructoare de automobile, aviatica. Modelarea pentru aplicațiea în inginerie necesită un grad sporit de acuratețe a reprezentării, întrucât modelele sunt destinate fabricației.
În ultimul deceniu, sfera de aplicabilitate a modelelor de modelare geometrică s-a extins la design, la dirijarea miscării roboților, la reconstrucția corpurilor 3D, în tomografi compiuterizate, în generarea de imaginii media.
Lucrarea de față își propune să ilustreye unul dintre elementele geometricii fundamentale pe care se bazează modelarea geometrică, anume pânza de suprafață de tip Bézier.
Lucrarea este structurată în 4 capitole. În primul capitol se introduc curbele Bézier necesare în reprezentare de tip wére-frame ale suprafeței Bézier. Sunt enumerate și demonstrate proprietăți geometrice ale acestor două metode (algoritmi de reprezentare grafică).
În capitolul al doilea sunt definite suprafețele Bézier sunt demonstrate proprietăți generice ale lor și este pus în evidență un algoritm de reprezentare bazat pe reprezentarea procedurală datorată lui de Casteljau.
Capitolul trei descrie o clasă de curbe și suprafețe Bézier cubice, cunoscute sub numele de curbe și suprafețe Hermite, ce sunt folosite în anumite probleme de interpolare.
Capitolul al patrulea este destinat aplicațiilor practice. Sunt descrise programele elaborate în C++ pentru vizualizarea curbelor și suprafețelor Bezier și Hermite și evidențierea unora dintre proprietăților acestora.
Capitolul I
CURBE BÉZIER
I.1. Curbe Bézier în baza Bernstein
În CAGD se lucrează preponderent cu curbe polinomiale adică curbe definite de o parametrizare polinomială: c : [a,b] 3 , c(t)=(x1(t), (x2(t), (x3(t)) cu xi Pn[a, b], , unde:
Pn[a,b] = { P : [a,b] P(t) = a0 + a1t + a2t2 + …+ antn,
a2 , }. (1)
Maximul gradelor polinoamelor xi, i=1,2,3 se numeste gradul curbei. Alegerea funcțiilor din această clasă pentru parametrizări de curbe și suprafețe este justificată de calculele simple necesare pentru evaluarea lor, ceea ce conduce la mărirea vitezei de lucru și la reducerea cumularii erorilor de calcul.
Cu ajutorul curbelor si suprafețelor astfel parametrizate se pot modela o mare diversitate de forme. Un argument în plus este oferit de teorema lui Weierstrass care afirmă că orice funcție continuă f : [a, b] este limita uniformă a unui sir de funcții polinomiale. Cu alte cuvinte o funcție continuă poate fi reprezentată cu precizie arbitrar fixată de o funcție polinomială.
În cele ce urmeaza consideram spațiul E3 raportat la reperul ortonormat = (O; {e1, e2, e3}) de sistem de axe Ox1 x2 x3 .
Observația 1.1. Orice curbă polinomială =imc, c:[a, b] 3. poate fi reparametrizată polinomial de o aplicație d : [0, 1] 3.
Într-adevăr cu ajutorul schimbarii de variabilă : [0, 1] [a,b], (s) = (1– s)a + sb, definim parametrizarea d prin d = c ○ . Acest argument ne asigură că nu se restrânge generalitatea considerând în cele ce urmează curbe polinomiale a caror parametrizare este definită exclusiv pe intervalul [0, 1].
Presupunând că = imc este o curbă polinomială de grad n,
(2)
asociem parametrizării punctele ai(a1i, a2i, a3i), . Astfel, formal, c(t) se poate scrie sub forma:
c(t)= a0+ a1 t+…+ antn. (3)
Scrierea este formală deoarece 1 + t + t2 +…+ tn ≠ 1 și deci nu are semnificație geometrică (dacă suma ar fi egală cu 1, atunci c(t) ar fi o combinație baricentrică a punctelor ai, ). Experții în CAGD au încercat sa gasească modul în care modificarea unuia sau a mai multor puncte ai din parametrizarea c(t) influențează geometria curbei, dar nu s-a găsit nimic concludent. Prin urmare aceste puncte nu au semnificație geometrică și deci scrierea (exprimarea) unei parametrizări polinomiale relativ la baza canonica B = (1, t, … tn) nu este utilă în designul liber.
În încercarea de a proiecta forme cât mai variate pentru capotele de automobile, Bézier, inginer la Renault, a avut ideea exprimarii funcțiilor polinomiale aparținând mulțimii Pn[a, b], relativ la baza Bernstein, , în locul bazei canonice. Polinoamele Bernstein sunt definite astfel :
unde (4)
Polinoamele Bernstein definite pe un interval arbitrar, [a, b], se definesc prin:
(5)
Cu alte cuvinte
Figura 1.1 Polinoamele Bernstein de grad trei.
I.2 Proprietăți ale polinoamelor Bernstein
1. Polinoamele Bernstein formează o partiție a unității adică:
(6)
Această proprietate rezultă din dezvoltarea lui 1= (t – (1–t ))n.
2.
(7)
Funcția are în [0,1] un punct de maximum pentru .
Polinoamele Bernstein verifică relația recursivă:
(8)
Verificarea este directă:
=
=+
=+ (9)
Definiția 1. 1. O mulțime ordonată de puncte (b1, b2, …, bn) din E3 se numește poligon de control sau poligon caracteristic și se notează PCn. Punctele bi se numesc puncte de control sau caracteristice, iar segmentele de extremități bi , bi+1 , , laturile poligonului. Dacă bn = b0 poligonul se numește poligon închis.
Fig 1.2. Curbă Bézier și înfăsurătoarea convexă
a punctelor sale de control
Definiția 1. 2. Fie PCn, : (b0 , b1 ,…, bn). Se numește curbă Bézier defnită de poligonul de control PCn, curba polinomială care în baza Bernstein este parametrizată de b : [0,1] 3,
(10)
Observația 1.2. Datorită proprietății 1. a polinoamelor Bernstein, suma este o combinație convexă a punctelor de control, deci nu este o sumă formală ca în cazul 3.
I.3 Proprietăți ale curbelor Bézier
1. Gradul unei curbe Bézier este mai mic cu o unitate decât numărul punctelor sale de control. Astfel o curbă Bézier de grad 1 este generată de două puncte de control b0 , b1 , , și este segmentul determinat de cele doua puncte.
2. O curbă Bézier interpolează extremitățile poligonului său de control, deoarece b(0)=b0 și b(1)=b1. Prin urmare dacă b0 = bn curba Bézier este închisă (fig. 3).
Fig 1.3 Curbă Bézier inchisă
3. O curbă Bézier este inclusă în înfăsurătoarea convexă a punctelor sale de control.
Într-adevăr conform Observației 1.2 curba Bézier este o combinație convexă a punctelor sale de control, deci ea este o submulțime a mulțimii tuturor combinațiilor convexe ale punctelor bi, , care este înfasurătoarea convexă a acestora (Fig. 1.2).
Datorită acestei proprietăți rezultă că o curbă Bézier generată de un poligon de control planar este o curbă plană. În particular curba generată de trei puncte de control este un arc de parabolă (Fig. 1.4). Mai mult dacă poligonul închis atașat poligonului de control prin adăugarea laturii bn b0, este convex, atunci și curba Bézier corespunzătoare este convexă. Dacă însă acest poligon nu este convex, curba poate fi sau nu convexă (Fig. 1.5).
Fig 1.4 Arc de parabolă, ca arc Bézier,
definit de trei puncte de control
Fig. 1.5. Curbe Bézior generate de diferitepoligoane de control
4. O curbă Bézier este invariantă față de inversarea ordinii punctelor
sale de control, adică poligoanele de control:
PCn : (b0, b1,…, bn), PC´n : (bn, bn-1,…, b0), (11)
definesc aceeași curbă.
Această proprietate este o consecință a relației . Și anume, fie curba asociată poligonului PCn și curba asociată poligonului PC´n (t , [0,1]). Atunci
(12)
5. O curbă Bézier este invariantă la schimbări afine de parametru, adică dacă b : [0,1] 3 parametrizează curba Bézier de puncte de control (b0, b1,…, bn), , și : [a,b] [0,1] este definită prin , atunci , u [a, b]. Prin urmare printr-o schimbare afină de parametru curba este reprezentată de o parametrizare din aceeași clasă (adică în baza Bernstein definită pe [a, b]).
6. O curbă Bézier este invariantă la transformari affine, în sensul că dacă este o curbă Bézier de poligon de control PC n : PCn : (b0, b1,…, bn) și A : E3 E3 o transformare afină atunci imaginea prin A a curbei este o curbă Bézier de poligon de control (A(b0), A(b1),…, A(bn)).
Această proprietate este foarte utilă, de exemplu în aplicațiile de vizualizare a unei curbe Bézier, când de obicei curba este supusă unei succesiuni de rotații si translații.
Să presupunem că dorim să vizualizăm curba Bézier 3D, definită de (bi), , după ce în prealabil a fost rotită în jurul unei axe. Datorită invarianției afine avem două posibilități:
sa evaluam funcția parametrizare într-un sir de puncte de diviziune tj , j = 0, 1,…, 500, ale intervalului [0,1] și apoi sa aplicăm rotația R celor 501 de puncte b(tj) de pe curbă;
să aplicăm rotația R doar punctelor de control b0, b1, b2, b3 și să generăm curba Bézier de puncte de control (R(bi)), .
Evident că prima variantă consumă un volum mai mare de calcule datorat numarului cu mult mai mare de puncte (501), asupra cărora acționează rotația comparativ cu 4 puncte în varianta a doua.
Tot în procesul de vizualizare, o curbă poate supusă unei transformări de scalare S(x1, x2, x3) = (rx1, rx2, rx3), r>0, care la fel, fiind transformare afină este util a se aplica punctelor de control si nu punctelor generate pe curbă.
7. O curbă Bézier are proprietatea de micșorare a numarului de oscilații. Mai precis numarul de intersecții ale unei curbe Bézier cu un hiperplan transversal acesteia (adică o dreapta în cazul curbelor plane și un plan în cazul curbelor 3D) este mai mic cel mult egal cu numarul de intersecții al hiperplanului respectiv cu poligonul de control al curbei.
I.4. Geometria unei curbe Bézier
Geometria curbei Bézier reprezentată în baza Bernstein de parametrizarea , este caracterizată de vectorii b(k)(t), k>=1. Pentru a exprima acești vectori în funcție de punctele de control (b0, b1,…, bn) , definim operatorul:
E :{b0, b1,…, bn} {b0, b1,…, bn}
Ebi = bi+1 (13)
Notând E2 bi = E (E (bi)), avem Ei Ej = Ei+j . E2 =1. Cu ajutorul acestui operator, parametrizarea curbei Bézier, , devine:
(14)
Într-adevăr, aplicând formula binomului lui Newton, avem .
Cu ajutorul operatorului E calculăm derivatele aplicației parametrizare b.
Propoziția 1.1 Fie =im(b) curba Bézier generată de poligonul de control PCn : (b0, b1,…, bn). Derivata de ordin k a aplicației parametrizare b este:
(15)
I.5. Reprezentarea procedurală a curbelor Bézier.
Algoritmul de Casteljau
Reprezentarea curbelor Bézier în baza Bernstein si numele acestor curbe sunt datorate lui Bézier, inginer la Renault. De Casteljau a dat o definiție procedurală a curbelor Bézier.
Lucrarile lui de Casteljau privind această problematică au fost elaborate înaintea celor ale lui Bézier, dar nu au fost niciodată publicate, ci au fost păstrate sub forma unor rapoate tehnice ale firmei Citroen. Rapoartele au devenit cunoscute cu mult mai târziu după conceperea schemei când deja devenise uzuală modalitatea de a defini curbele prin metoda dată de Bézier, folosind exprimarea curbelor în baza Bernstein. Astfel aceste curbe poartă doar numele lui Bézier.
Pentru a deduce schema lui de Casteljau de generare a unui punct pe o curbă Bézier definită de poligonul de control (b0 , b1 ,…, bn), pornim de la . Notând
, (16)
avem pentru s r + 1 formula recursivă:
br,…,s(t) = (1-t + tE) (1-t + tE)s-r-1br =
= (1-t ) (1-t + tE)s-r-1br + t(1-t + tE)s-r-1br+1
= (1-t )br,…,s-1 + t br+1,…,s, (17)
Unde {r,…,s} {0,1,…,n}.
În cazul s = r + 1 avem:
brs = (1 – t)br + t bs (18)
Cum
, (19)
rezultă următoarea schemă de evaluare a unui punct pe curba Bézier corespunzator parametrului t :
b0
b1 b0,1
b2 b1,2 b0,1,2
. . .
. . . (20)
. . .
bn-1 bn-2,n-1 bn-3,n-2,n-1 lor Bézier în baza Bernstein si numele acestor curbe sunt datorate lui Bézier, inginer la Renault. De Casteljau a dat o definiție procedurală a curbelor Bézier.
Lucrarile lui de Casteljau privind această problematică au fost elaborate înaintea celor ale lui Bézier, dar nu au fost niciodată publicate, ci au fost păstrate sub forma unor rapoate tehnice ale firmei Citroen. Rapoartele au devenit cunoscute cu mult mai târziu după conceperea schemei când deja devenise uzuală modalitatea de a defini curbele prin metoda dată de Bézier, folosind exprimarea curbelor în baza Bernstein. Astfel aceste curbe poartă doar numele lui Bézier.
Pentru a deduce schema lui de Casteljau de generare a unui punct pe o curbă Bézier definită de poligonul de control (b0 , b1 ,…, bn), pornim de la . Notând
, (16)
avem pentru s r + 1 formula recursivă:
br,…,s(t) = (1-t + tE) (1-t + tE)s-r-1br =
= (1-t ) (1-t + tE)s-r-1br + t(1-t + tE)s-r-1br+1
= (1-t )br,…,s-1 + t br+1,…,s, (17)
Unde {r,…,s} {0,1,…,n}.
În cazul s = r + 1 avem:
brs = (1 – t)br + t bs (18)
Cum
, (19)
rezultă următoarea schemă de evaluare a unui punct pe curba Bézier corespunzator parametrului t :
b0
b1 b0,1
b2 b1,2 b0,1,2
. . .
. . . (20)
. . .
bn-1 bn-2,n-1 bn-3,n-2,n-1 … b0,…,n-1
bn bn-1,n bn-2,n-1,n … b1,2,…,n b0,…,n
Fiecare punct din matricea triunghiulară se obține ca o combinație convexă cu coeficienții (1 – t), t, a punctelor situate pe coloana precedentă pe linia deasupra și respectiv pe aceeași linie. De exemplu,
b1,2,3=(1 – t ) b1,2 + t b2,3 .
Reindexând punctele din matricea (20)
. . .
. . . (21)
. . .
…
…
schema de Casteljau se exprimă recursiv prin:
(22)
I.6. Interpretarea geometrică a algoritmului lui Casteljau
Pentru a înțelege schema geometrică a lui de Casteljau o prezentăm mai întâi pentru cazul pătratic. Fie b0,b1,b2 trei puncte în E³. Pentru fiecare t [0,1] definim
(23)
Prin urmare în prima etapă a schemei de Casteljau se realizează interpolarea afină a punctelor de control succesive. Pentru t fixat, punctele , împart segmentele corespunzătoare în aceelași raport . În etapa următoare se interpolează afin aceste două puncte:
(24)
Înlucuind (2.27) în (2.28) obținem
(25)
adică parametrizarea Bézier a unei curbe pătratice. Punctul de pe curbă , împarte segmentul [, ] în același raport, .
Ilustrarea modului de generare a unui punct de pe o curbă Bézier de grad 3 este ilustrat în Fig.1.6.
Fig 1.6 Interpretarea geometrică a algoritmului de Casteljau.
În procesul iterativ al schemei de Casteljau, de evaluare a unui punct de pe curba Bézier definită de PCn :(b0, b1,…, bn), se determină practic și direcția tangentei la curbă în acel punct. Si anume :
Propoziția 1.3 Dacă b este parametrizarea curbei Bézier definită de PCn : (b0, b1,…….bn), atunci:
, (26)
unde , sunt puncte calculate în penultima etapă (etapa n-1 ) a schemei de Casteljau.
Demonstrație : Luând în (2.17) k = 1, avem .
Propoziția 1.4 Fie Γ = im(b) E3 curba Bézier definită de PCn :(b0, b1,…, bn). Atunci punctele,,evaluate în etapa n-2 a schemei de Casteljau determină planul osculator curbei în punctul b(t).
Demonstrație : Se știe că planul osculator în punctul b(t) al curbei Γ este planul ce conține acest punct și direcțiile . Luând în (2.17) k =2 obținem :
. (27)
Cum și , i=0,1, rezultă că planul osculator este perfect determinat de cele trei puncte calculate în etapa n -2 a algoritmului de Casteljau (evident dacă acestea nu sunt coliniare, adică punctul curbei este regulat).
Numărul operațiilor în evaluarea unui punct de pe o curbă Bézier de grad n este liniar în n în cazul în care algoritmul Horner-Bézier și respectiv pătratic, în cazul algoritmului de Casteljau. Totuși este de preferat algoritmul de Casteljau, fiind numeric mai stabil și furnizând în etapa n-1 și direcția tangentei în punctul evaluat.
I.7 Relații între poligonul de control și forma
cuebei Bézier asociate
Curbele Bézier au fost introduse în ideea de a genera curbe ce ”mimează” forma poligonului de control. Ele s-au folosit inițial în designul liber. Pentru a reproduce forma unei curbe desenate liber, se definește un poligon de control și apoi se generază curba Bézier asociată. Dacă forma obținută este necorespunzătoare, se ajustează punctele de control până ce obținem forma unei curbe cât mai apropiată de cea desenată liber. Modificarea adecvată a unor puncte ale poligonului inițial necesită cunoașterea modului în care o anumită schimbare în poziția punctelor de control influențează geometria curbei.
Mai întâi investigăm cum se schimbă forma curbei dacă modificăm un singur punct de control.
Fie Γ = im (p) curba Bézier definită de poligonul :
(b0,…, bj-1, bj, bj+1,…, bn) (28)
și Γ' = im (b) curba definită de (b0,…, bj-1, cj, bj+1,…, bn).
. (29)
Rezultă astfel că –b(t)= . Pentru j {1,2,….n-1}, polinoamele Bernstein se anulează doar în 0 și 1 și deci curba Γ´ se deplasează pe direcția , cu excepția extremitățiilor b0, bn. Analog se deduce modificarea în cazul j = 0 sau j = n. Cum maximul funcției este atins pentru rezultă că, înlocuind punctul de control bj cu cj , curba este cel mai mult afectată într-o vecinătate a punctului . Astfel efectul acestei schimbări este suficient de previzibil (Fig.1.7).
Fig. 1.7 Modificarea formei unui arc Bézier
când se schimbă un punct de control.
Inserând în șirul punctelor de control :
PCn :(b0,…, bj-1, bj, bj+1…, bn) (30)
punctul bj, de mai multe ori succesiv, atunci curba generată de
(b0,…, bj-1, bj, bj,…, bj,bj+1,…, bn) (31)
este mai apropiată de bj, pentru că ponderea punctului bj crește în suma ce definește parametrizarea Bernstein a curbei. De exemplu, pentru curba asociată poligonului (2.34) bj are ponderea , iar pentru curba asociată poligonului
PCn+k : (b0,…, bj-1, bj, bj,…, bj, bj+1,…, bn) (32)
k
unde bj apare de k ori, ponderea acestui punct este
Posibilitățiile de control a formei curbei Bézier, precum și stabilitatea numerică a algoritmului de Casteljau fac ca acestea să constituie standardul geometric ideal pentru reprezentarea curbelor polinomiale pe porțiuni.
Fig 1.8 Modificarea unui arc Béyier prin
Reinserarea unui punct de control
I.8 Mărirea gradului parametrizării unei curbe Bézier
Considerăm curba Bézier definită de poligonul de control (b0, b2 ,…, bn). Ne punem următoarea întrebare: poate fi generată această curbă de n+2 puncte de control? Adică se poate reparametriza curba polinomial de grad mai mare ca n? Răspunsul este dat de :
Propoziția 1.5 Curba Bézier definită de poligonul de control (b0, b1 ,…, bn) coincide cu curba asociată poligonului (c0, c1 ,…, cn, cn+1), unde :
(33)
. (34)
Demonstrație: Fie b, respectiv c, parametrizările în baza Bernstein a curbelor definite de cele două poligoane de control. Ambele parametrizări fiind definite pe intervalul [0,1] curbele definite pe acestea coincid, dacă și numai dacă există o schimbare de parametru φ : [0, 1] → [0, 1], astfel încât c(t) = b(φ(t)), t[0, 1]. Cum însă ambele parametrizări sunt polinomiale singura schimbare de parametru ce conduce tot la o parametrizare polinomilaă este schimbarea afină de parametru. Dar aplicația afină ce conservă orientarea și transformă [0, 1] pe [0, 1] este φ(t) = t. Prin urmare parametrizările b și c definesc aceeași curbă dacă și numai dacă b(t) = c(t), t[0, 1] , adică :
(35)
Înmulțind membrul stâng cu 1 = t + ( 1 – t ) și comparând coeficienții monomului din ambii membri ai egalității, găsim relația necesară și suficientă între punctele de control ale celor două poligoane pentru ca ele să genereze aceeași curbă.
Observația 1.3 Observăm că, cu excepția punctelor de extreme care coincid (c0 = b0, cn+1 = bn), restul punctelor ci, i = 1, 2,…., n aparțin segmentelor de extremități bi-1, bi (Fig.2.10).
Fig. 1.9 Mărirea gradului unei curbe Bézier.
Posibilitatea creșterii gradului parametrizării unei curbe Bézier date este utilă în:
generarea suprafețelor. Există algoritmi specifici în CAGD care generează o suprafață din date de intrare ce sunt curbe Bézier reprezentate de poligonul de control. Pentru a defini parametrizarea suprafeței este necesar ca toate curbele intrări să aibă același grad;
transferul datelor dintre diferite sisteme CAD/CAM sau sisteme grafice care lucrează doar cu curbe de un grad fixat. Dacă sistemele între care se face transferul impun grade diferite, prin ridicarea gradului se realizează compatibilitatea.
Capitolul II
SUPRAFEȚE BÉZIER
II.1. Suprafețe de tip produs tensional
Suprafețele elementare, folosite în CAGD, sunt de obicei suprafețe de tip produs tensorial. Mai précis, în spațiul vectorial real Pm[a, b] al funcțiilor polinomiale definite pe [a, b] de grad mai mic sau egal cu m, se consideră o bază (spațiul are dimensiunea m+1). Analog consideram si în Pn[a, b] baza Bn, de același tip ca si Bm.
Fie init o curbă polinomială, inițială, având parametrizarea:
(2.1)
Fig. 2.1 Poliedru de control definit de o rețea
de puncte
Curba init este supusă unei deplasări și deformări, astfel încât fiecare punct ci, i=0, 1,…,m din (2.1) parcurge o traiectorie reprezentată de curba I :
(2.2)
Astfel curba init descrie în această “miscare” o suprafață S, parametrizată de s : [a, b] [c, d] E3,
(2.3)
Suprafața S astfel generată și parametrizată de (2.3) se numește suprafața de tip produs tensorial. Observăm că o astfel de suprafață este perfect determinată de o rețea de puncte . Dacă în procedura descrisă, curbele polinomiale implicate sunt exprimate în baza canonica Bm=(1, u,…, um), respectiv Bn=(1, v, v2,…, vn) atunci suprafața S are parametrizarea:
(2.4)
sau matricial
(2.5)
Rețeaua de puncte ce definește suprafața se numeste în acest caz matrice algebrica de puncte.
Suprafețele polinomiale definite de (2.4) sunt mai puțin folosite în CAGD deoarece punctele pij nu au o semnificație geometrică, adică nu dau nici o informație despre geometria suprafeței.
În cazul în care baza Bm, respective Bn, este baza Bernstein atunci suprafața asociată rețelei de puncte parametrizată de
(2.6)
se numește suprafață Bézier, pânză sau petic Bézier de grade (m, n), iar matricea de puncte (bij) se numeste rețeaua punctelor de control ale suprafeței Bézier. Cele mai folosite în CAGD sunt pânzele de suprafață Bézier de grade (m = 3, n =3) numite suprafețe bicubice (Fig 2.2).
Fig. 2.2 Suprafață Bézier bicubică; (m=3, n=3).
Unei suprafețe Bézier i se asociază o suprafață poligonală pe porțiuni adică reuniunea tuturor patrulaterelor de varfuri bij, bij+1, bi+1j, bi+1j+1, , . În cele ce urmează numim această suprafață poliedrul de control al suprafeței Bézier, ca fiind corespondentul poligonului de control al unei curbe Bézier (Fig. 2.1).
II.2. Suprafețe Bézier
Relații între poliedrul de control și suprafața Bézier
Propoziția 2.1 O suprafață Bézier interpolează punctele b00, bm0, b0n, bmn, adică “colțurile” matricii punctelor de control aparțin suprafeței.
Demonstrație: Cum din (2.6) obținem că s(0, 0) = b00, s(1, 0) = bm0, s(0, 1) = b0n, s(1, 1) = bmn.
Propoziția 2.2 O suprafață Bézier este inclusă în înfăsurătoarea convexă a punctelor sale de control.
Demonstrație: Fie . Exploatând proprietățile polinoamelor Bernstein avem:
. (2.7)
Prin urmare este o combinație convexă a punctelor (bij) și deci suprafața este inclusă în înfășurătoarea convexă a punctelor sale de control.
Propoziția 2.3 O suprafață Bézier S, având rețeaua de control (bij), este afin invariantă adică, oricare ar fi transformarea afină A : E3 E3, A = A + c (det (A) ≠ 0), imaginea prin A a suprafeței este de asemenea o suprafață Bézier de rețea de control A (bij ).
Demonstrație: Efectul aplicației A asupra unui punct p E3 este A(p) = A ∙ p + c.
Dacă suprafața S este parametrizată de
, (2.8)
atunci
A(s (u, v)) = A ∙ s (u, v) + c
=
=
= (2.9)
Această proprietate este foarte utilă în manipularea unei suprafețe Bézier. În grafica pe calculator un obiect geometric este supus înainte de vizualizare unei succesiuni de rotații si translații. Acestea fiind transformări affine, în loc să aplicam aceste transformări suprafeței digitizate, prin evaluarea aplicației parametrizare în punctele grilei (uk, vl) de dimensiune, sa zicem, 1001 1001, (s (uk, vl)) reducem volumul de calcule aplicând transformările doar punctelor de control bij , , , și vizualizând suprafața generată de punctele obținute prin transformările prescrise.
Fig. 2.3 Suprafață Bézier de grad (m=3, n=3) și poliedrul de control.
Se remarcă poligoanele de control ale curbelor coordinate frontieră,
ca fiind definite din liniile, respective coloanele extreme ale retelei de puncte.
Propoziția 2.4 Curbele frontieră ale unei pânze Bézier, , adică curbele I , i = 1, 2, 3, 4 parametrizate respectiv de ci, c1(v) = s(0, v), c2(v) = s(1, v), c3(u) = s(u, 0), c4(u) = s(u, 1), sunt curbe Bézier având drept puncte de control, respectiv :
1 : b00, b01, … , b0n (linia 0)
2 : bm0, bm1, … , bmn (linia m)
3 : b00, b10, … , bm0 (coloana 0)
4 : b0n, b1n, … , bmn (coloana n).
Demonstrație: Demonstrația o efectuăm doar pentru . Cum , rezultă că . Prin urmare .
Observația 2.1 Curbele coordonate de pe suprafața Bézier, diferite de curbele frontieră, adică curbele corespunzatoare lui u = u0, u0 ≠ 0, 1 și respectiv v = v0, v0 ≠ 0, 1 nu au drept puncte de control linii sau coloane din matricea bij .
Într-adevăr, fie curba : v = v0 având parametrizarea
c
. (2.10)
Deci punctele de control ale curbei nu sunt puncte din rețeaua (bij).
Să analizam cea mai simplă pânză Bézier generată de 4 puncte de control , adică de grade (1, 1).
Parametrizarea pânzei corespunzatoare este
(2.11)
Dar , și deci:
(2.12)
Cum o suprafață Bézier interpolează “colțurile” rețelei sale de control în acest caz particular suprafața este un interpolant al celor patru puncte numit interpolant biafin deoarece curbele coordonate sunt segmente de dreaptă. Într-adevar :
=
Deci curba coordonată u=u0 este segmentul de extremități c0, c1, unde c0 aparține segmentului [b00, b10], iar c1 segmentului [b01, b11]. (Fig 7.4).
Fig. 2.4. Suprafața Bézier generată de o rețea construită din 4 puncte.
Analog se evidențiază că și curbele coordonate v=v0 sunt segmente de dreaptă.
Prin urmare, interpolantul biafin a patru puncte este, în limbajul geometriei diferențiale clasice o pânză riglată.
Evaluarea unui punct pe o suprafață Bézier.
Fie (u0, v0) [0, 1][0, 1]. Punctul suprafeței Bézier corespunzător acestor parametri fixați se evaluează scriind:
. (2.13)
Discretizarea unei suprafețe Bézier se realizează divizând intervalul ca domeniu pentru parametrul u cu pasul hu = 1/Nu , Nu+1 fiind numărul punctelor de diviziune și cu pasul hv = 1/Nv domeniul parametrului v. Astfel vom genera Nu +1, respectiv Nv +1 curbe coordonate u = c, respectiv v = c. Pentru fiecare curbă coordonată se precizează apoi numarul de puncte ce vor fi evaluate.
Vectori asociați unei pânze Bézier
Se stie din geometria diferențială că vectorii , și , i+j=2 asociați fiecărui punct al unei suprafețe diferențiabile, parametrizate de s, și mărimile asociate lor, caracterizează local geometria suprafeței. Pentru calculul acestor vectori introducem ca și în cazul curbelor Bézier, operatorii E10, E01, definiți astfel:
(2.14)
Cu ajutorul acestor doi operatori parametrizarea unei suprafețe Bézier definită de rețeaua de control (bij), , , este:
(2.15)
Ca si în cazul curbelor Bézier se demonstrează prin inducție:
Propoziția 2.5 Derivata de ordin k+l a parametrizării s a suprafeței Bézier definită de rețeaua de control (bij), , , este:
(2.16)
Notând ∆10:=E10 – 1, ∆01:=E01 – 1, obținem în particular
pentru k = l, l = 0:
, (2.17)
respectiv pentru k = 0, l = l:
. (2.18)
Suntem interesați în mod deosebit de vectorii tangenți în cele patru colțuri, b00, b0n, bm0, bmn, ale suprafeței la curbele coordonate ce conțin aceste puncte:
1. Vectorii tangenți curbei v = 0 în extremitațile sale:
(2.19)
2. Vectorii tangenți în b0n, bmn la curba v = 1:
(2.20)
3. Vectorii tangenți curbei u = 0:
(2.21)
4. Pentru u = 1, vectorii de interes sunt:
(2.22)
Fig.2.5 Poziția și sensul vectorilor tangenți la curbe frontieră ale unei
suprafețe Bézier bicubice față de poligoanele de control
ale curbelor frontieră respective.
În Fig. 2.5. sunt vizualizați vectorii tangenți la curbe coordonate frontieră ale unei suprafețe bicubice Bézier. Vectorul tangent la u = 0 în b00, de exemplu, este vectorul determinat de punctele b00, b00 + 3(b10 – b00).
Pe lângă vectorii tangenți curbelor frontieră în extremitațile acestora prezintă interes în studiul racordului a doua pânze Bézier bicubice ( m = 3, n = 3) și vectorul numit în CAGD vectorul răsucire (twist vector):
, (2.23)
unde ∆11=∆10○∆01. Prin urmare
∆11bij = ∆10(bi j+1 – bij)= ∆10bi j+1 – ∆10bij =
= bi+1 j+1 – bi j+1 – bi+1 j – bi j (2.24)
În racordul de clasă GC1 a două petice Bézier sunt implicate și derivatele
, respective ,
în punctele curbelor frontieră, ce au respectiv ecuațiile: v = є, u = є, є = 0, 1. Acestea se numesc derivate transversale frontierei v = є, respectiv frontierei u = є. De exemplu, reprezintă vectorul tangent în extremitatea inițială la curba coordonată corespunzatoare celui de-al doilea parametru fixat pe valoarea v.
Evaluand (7.18) în (0, v), obținem:
. (2.25)
Această relație se interpretează astfel:
(2.26)
Deci câmpul de vectori este coliniar cu câmpul de vectori , definit de punctele corespunzătoare de pe curbele Bézier generate respectiv de linia 0 și linia 1 a rețelei de puncte (Fig. 7.6).
Fig 7.6 Vectorul transversal curbeicoordonate u=0
Observația 2.2 În timp ce im(P) este curbă pe suprafață, curba im(Q) nu aparține suprafeței.
În mod analog, derivata (vectorul) transversală (transversal) curbei coordonate v = 0, într-un punct arbitrar al său este:
(2.27)
II.3 Particularități ale formei pânzelor Bézier
O pânză Bézier definită de punctele de control (bij) este în general o pânză dreptunghiulară, în sensul că, curbele frontieră formează un patrulater curbiliniu. Totuși există situații în care pânza este triunghiulară sau chiar are doar două curbe drept frontieră. Acestea sunt pânze degenerate.
Propoziția 2.6 Dacă matricea punctelor de control (bij), , , are o linie extremă sau o coloană extremă formată din puncte identice, atunci suprafața asociată este triunghiulară.
Demonstrație: Presupunem de exemplu că punctele coloanei 0 coincid: b00 =…= bi0 =…= bm0 := b. Atunci curba frontieră generată de aceste puncte are parametrizarea:
(2.28)
Dar , iar, . Prin urmare suma interioară este egală cu bi0 = b și deci . În concluzie curba frontieră generată de punctele din coloana 0 a matricii este degenerată la un punct.
Fig. 2.7 Suprafață Bézier determinată de o rețea de puncte de control bij.
Fig. 2.7 ilustrează o pânză Bézier triunghiulară, generată de o rețea de puncte de control pentru care punctele de pe linia 0 sunt identice. Similar se arată că dacă simultan prima si ultima linie sau prima si ultima coloană a matricii de puncte au fiecare în parte puncte identice, atunci pânza Bézier corespunzatoare are frontierele formate din două arce de curbă ale căror extremități concid două câte două.
Singularitățile unei pânze Bézier sunt caracterizate și de degenerarea vectorilor tangenți la curbele coordinate. Când suntem interesați de racordul a două pânze în lungul unei curbe frontieră comună, se analizează degenerarea vectorilor asociați colțurilor pânzelor ce urmează a fi racordate.
Versorul normalei într-un punct arbitrar al unei pânze Bézier este
(2.29)
sau evaluat în unul din colțuri de exemplu (0, 0):
(2.30)
Astfel normala în b00 este nedefinită dacă vectorii ∆10b00 = b10 – b00, ∆01b00 = b01 – b00 sunt liniar dependenți. O astfel de degenerare există când fie linia 0 fie coloana 0 au elementele formate din puncte identice, caz în care vectorul ∆10b00 sau ∆01b00 este vectorul nul. Evident că este suficient ca b00 si b10 sau b00 și b01 să coincidă, pentru ca vectorul normal să fie nul.
Să evaluăm derivata mixtă (vectorul răsucire) în colțuri. măsoară modul de variație al vectorului tangent când u este variabil. De exemplu,
. (2.31)
Observăm că acest vector este nul când , adică atunci când patrulaterul este parallelogram. Deci în cazul în care punctele b00, b10, b01, b11 sunt coplanare și ele sunt vârfurile unui paralelogram atunci vectorul răsucire în b00 este nul.
Prin permutări se obțin informații similare despre comportamentul derivatelor , în restul curbelor frontieră, respectiv în restul colțurilor.
II.4 Modificarea numărului de vârfuri ale rețelei
de control a unei pânze Bézier
La fel ca și în cazul curbelor Bézier se poate mări numarul de puncte ale rețelei de control, fară a afecta forma suprafeței.
Când se impune creșterea numărului de puncte într-o rețea? Cel mai adesea pentru realizarea unei curbe coordonate de frontieră de același grad, în cazul racordării a doua petice Bézier în lungul curbei respective. Creșterea numărului de puncte se aplică fie “în direcția lui u” fie a lui v, adică fie pe liniile, fie pe coloanele rețelei. Exploatând rezultatele demonstrate relativ la creșterea gradului unei curbe Bézier obținem modalitatea de creștere a gradului în u sau v a unei pânze Bézier.
Presupunem că inițial suprafața este generată de rețeaua (bij), , . Construim rețeaua b´ij , i = 0, 1,…, m+1, j = 0, 1,…, n, adică inserăm o linie în plus:
(2.32)
unde
(2.33)
j{0, 1,…, n}. (2.34)
Relația între cele două poliedre de control este ilustrată în figura Fig.7.8, pentru cazul m = 2, n = 2.
Fig. 2.8 Suprafață Bézier bipătratică (de grade m=2, n=2) definită
simultan de rețeaua bij, și rețeaua bkj´, , obținută
prin mărirea gradului de la m=2 la m=3.
Cu modificări evidente, se obțin si relațiile corespunzătoare între punctele rețelei inițiale și a celei obținute prin adăugarea unei coloane în plus.
II.5 Racordarea pânzelor dreptunghiulare Bézier.
Faza de racordare a pânzelor (peticelor) de suprafață constituie o etapă importantă în construcția unei suprafețe, pentru că ea influențează calitatea suprafeței finale.
În racordarea a doua pânze se urmareste realizarea continuității de pozitie si a continuității planului tangent.
O suprafață S = S1 S2 are continuitate de poziție când cele două pânze S1, S2 coincid în lungul unei curbe frontieră, fie în intregime, fie parțial. De exemplu, dacă S1 = im(s1), S2 = im(s2), si : [0, 1][0, 1] R3, i = 1, 2 și s1(1, v) = s2(0, v) pentru orice v [a, b], atunci avem continuitate de poziție. ( Fig. 7.9).
Fig. 2.9 Racordul a două pânze de suprafață ce asigură continuitate de poziție.
Continuitatea planului tangent într-un punct s2(1, v) înseamnă coincidența acestui plan cu planul tangent în s2(0, v), v [a, b]. Aceasta revine la a impune coliniaritatea vectorilor normali la cele două pânze în aceste puncte. Continuitatea planului tangent se numeste continuitate geometrica de tip GC1.
Presupunem că S1, S2 sunt două pânze Bézier generate de rețelele de control (bij), , , respectiv (ckj), , și au în comun curba frontieră = im(s1 (1, ∙)) = im im(s2 (0, ∙)). Ipoteza că cele două suprafețe au același grad n, în v, nu restrânge generalitatea. Dacă eventual prima suprafață este de grad n1 în v, iar cea de a doua de grad n2, atunci se mărește relativ la v gradul uneia dintre pânzele Si, i = 1, 2, la n = max(n1, n2). În acest context curba comună este o curbă de grad n.
Cum curba comună este curba Bézier generată, pe de o parte de linia
m din rețeaua (bij) și, pe de alta parte, de linia de indice 0 din rețeaua (ckj), rezultă că
(2.35)
În cele ce urmează deducem relația dintre punctele de control ale celor două pânze din liniile “vecine” liniei ce generează curba comună, atât din matricea de puncte b, cât si c, relație care asigură racord de clasă GC1.
Racordul de clasa GC1 în lungul curbei presupune continuitatea planului tangent la cele două pânze în punctele curbei adică coliniaritatea vectorilor normali la cele două pânze în fiecare punct al curbei . În contextul precizat, curbele coordonate u = u0 pe suprafața S = S1 S2 sunt de clasă C. Curba comună, având aceeași parametrizare r = s1(1, ∙) = s1(0, ∙) : [0, 1] R3 pe ambele suprafețe, are vectorul tangent . Curbele coordonate transversale, parametrizate de
(2.36)
au vectorul tangent . Dacă aceste curbe sunt de clasă GC1 în u = 1, atunci există funcția α0, astfel încat ( este vectorul tangent la stânga iar, este vectorul tangent la dreapta în punctual ). Astfel este evident că normalele la cele două pânze în punctele curbei sunt coliniare, deci continuitatea de clasă GC1 a suprafeței S este asigurată.
Fig. 2.10 Racord de clasă GC1 a două pânze Bézier, una având matricea
punctelor de control de tip 23 iar cealaltă de tip 22. Sus, cele două
suprafețe și poliedre de control corespunzătoare, iar jos suprafața rezultată
în urma racolării celor două pânze.
Dacă racordul celor două pânze este GC1, atunci distingem două cazuri: racordul curbelor coordonate, transversale curbei este de clasă GC1 și respectiv racordul nu este de clasă de GC1. Să discutăm primul caz.
Propoziția 2.7 Dacă curbele coordonate transversale curbei frontieră comuna celor doua panze Bézier asociate rețelelor de control (bij), , , respective, (ckj), , , sunt de clasa GC1, atunci bmj = c0j, și punctele bm-1 j, bm j, c1j sunt coliniare , iar raportul în care bmj împarte segmentul [bm-1 j , c1j] nu depinde de j.
Demonstrație: Coincidența punctelor din linia m a primei rețele, cu linia 0 a celei de-a doua, a fost argumentată mai sus. Continuitatea de clasa GC1 a curbelor coordonate transversale curbei implică coliniaritatea vectorilor , . Particularizând (7.17) obținem:
(2.37)
și
(2.38)
Ținând seama că bmj = c0j , , avem:
(2.39)
Vectorii , fiind coliniari și de același sens există > 0 astfel încat =, adică ținând seama de (7.38 – 7.40),
(2.40)
Polinoamele Bernstein fiind liniar independente relația de mai sus are loc dacă și numai dacă m(bmj- bm-1 j) = p(c1j – bmj), , adică
, (2.41)
ceea ce exprimă coliniaritatea punctelor bm-1 j , bmj , c1j și independența de j a raportului în care bmj divide segmentul de extremitași bm-1 j , c1j .
În concluzie dacă pânzele S1, S2 au racord de clasa GC1 în lungul curbei și curbele coordonate transversale curbei sunt de clasa GC 1, atunci linia m a rețelei ce definește S1 coincide cu linia 0 a rețelei ce definește S2, iar punctele din linia 0 a matricii (ckj) se exprima astfel
(2.42)
Este acum un simplu exercițiu să arătăm că aceste două condiții relativ la punctele de control ale celor două pânze sunt satisfacute, atunci pânzele au o frontieră comună în lungul căreia racordul este de clasă GC1 .
Dacă pânzele S1, S2 au racord de clasă GC1 în lungul curbei , dar curbele coordonate transversale V = v nu sunt neaparat de clasa GC1, atunci relația dintre punctele c1j pe de o parte și bmj, bm-1 j, pe de altă parte depinde de mai mulți parametri. Pentru a deduce această dependență procedam astfel: Exprimăm vectorul în funcție de baza (, ) din spațiul tangent în punctul la suprafața S. Pentru că are aceeași parametrizare și pe S1 și pe S2 avem:
(2.43)
Conform relațiilor (7.40), (7.38), și sunt polinoame de
grad n în v. Pe de altă parte
(2.44)
este polinon de grad n-1 în v, astfel rezultă că , iar . Deci
(2.45)
Ținând seama de identitățile:
(2.46)
(2.47)
și de relația între parametrizarea unei curbe Bézier definită de punctele d0,…, dn-1 și parametrizarea corespunzătoare măririi gradului cu o unitate avem:
(2.48)
avem succesiv:
(2.49)
Înlocuind în (7.46) și ținând seama că polinoamele Bernstein sunt liniar independente, obținem:
(2.50)
(Punctele formale bm n-1, bm n+1 ce apar în relația de mai sus au coeficientul 0, deci prezența lor este fără importanță). Pentru fiecare , punctul c1j depinde deci de 4 puncte bm-1 j , bm j , bm j-1 , bm j+1 . Notând cu observăm că acest punct se află pe dreapta (bm-1 j bm j) și raportul în care bmj împarte segmentul [bm-1 j , dj] nu depinde de j.
În concluzie când curbele coordinate, transversale curbei de racord de clasa GC1 a pânzelor S1, S2 sunt de clasa GC1 avem mai puțini parametri de design dar condițiile de legatură între punctele de control de pe liniile vecine liniei ce generează curba sunt mai simple.
Condițiile necesare de racord de clasă GC1 a două pânze Bézier sunt și condiții suficiente.
Capitolul III
SUPRAFEȚE HERMITE
În etapa de început a dezvoltării CAGD, primele tipuri de curbe, respectiv suprafețe folosite, erau cubicele, respectiv bicubicele exprimate în baza canonică din spațiul funcțiilor polinomiale. Primele lucrări ce abordează problema modelării geometrice folosind această modalitate de reprezentare a curbelor și suprafețelor sunt datorate lui Ferguson [Fer-guson, 1964] și tehnicile dezvoltate de el au fost aplicate în proiectarea de subansamble în industria aviatică, mai precis la Boeing Co. Mai apoi s-a înlocuit reprezentarea curbelor și suprafețelor polinomiale în baza canonică, cu reprezentarea în baza Bernstein (curbe și suprafețe Bezier) din motivele expuse în capitolul Curbe Bezier, și anume coeficienții (sau mai exact coordonatele) în baza Bernstein codifică geometria curbei (au semnificație geometrică) în timp ce coordonatele în baza canonică nu furnizează nici o informație despre geometria curbei.
In cele ce urmează prezentăm cele două clase de curbe și suprafețe exprimate în baza Hermite. Această formă se folosește mai puțin în designul liber, dar peticele de suprafață Hermite se folosesc în generarea formelor plecând de la date obținute prin digitizarea unei mostre a obiectului fizic ce urmează a fi generat computațional (vezi Cap.12, Suprafețe Coons).
III.1 Curbe cubice Hermite
Fie F = im(r), r : [0,1] —>■ R3, o curbă polinomială cubică. Vom arăta că ea este perfect determinată de condițiile inițiale:
r(0) = po, r(l) = Pl, r(0) = t0, r(l) = ti, (3.1)
adică de extremitățile arcului de curbă și de vectorii tangenți în aceste extremități. Practic, vom arăta că aceste date inițiale determină perfect parametrizarea în baza Bernstein a curbei F:
(3.2)
adică determină în mod univoc, punctele de control Bezier. Din proprietățile curbelor Bezier avem că b(0) = 3(b – b), b(1) = 3(b – b2) și b = p, iar b = p.
Astfel din 3(b-b0)=t0 (3.3)
3(b3-b2)=ti, (3.4)
obținem că b= p+ t0, (3.5)
b= p- t1 (3.6)
Deci,
b(t) = pB(t)+( p+ t)B+( p- t)B+
+(p- t)B(t)+pB(t)=
p(B)(t)+B(t))+p(B(t)+B(t)+
tB(t ) – tB(t). (3.7)
Notăm
H (t) :=B(t)+ B(t)
H (t) :=B(t)+ B(t)
H (t) := B(t)
H (t) := -B(t) (3.8)
Polinoamele H (t), i= se numesc polinoame Hermite.
Propoziția 3.1 Polinoamele Hermite constituie o bază în spațiul vectorial real P[0,1], al funcțiilor polinomiale de grad mai mic sau egal cu 3, definite pe [0,1].
Demonstrație: într-adevăr, H = M . B sau detaliat:
(3.9)
Cum polinoamele Bernstein (B, B, B, B), constituie o baza in P[0,1] și det(M)0, rezultă că și polinoamele Hermite (H,H,H,H), formează o bază în același spațiu.
Prin urmare, date fiind condițiile inițiale (8.1) pentru o curbă cubică, acestea definesc parametrizarea cubicei în baza Hermite:
h(t)=pH(t)+ pH(t)+ tH(t)+ tH(t), t[0,1] , (3.10)
Mai mult, această exprimare este corectă din punct de vedere geometric, pentru că:
H (t) + H(t)= =1, t[0,1], (3.11)
deci pH(t)+ pH(t) este o combinație convexă de puncte. Astfel parametrizarea unei cubice în baza Hermite este de forma:
h(t)=P(t)+V(t), P(t)E, V(t)R, t[0,1]. (3.12)
Curba = im(h), interpolează punctele p,p , cu tangente prescrise în aceste puncte. Interpolarea cubică Hermite are câteva dezavantaje:
• ea nu este invariantă la transformări afine ale parametrilor. De exemplu, schimbarea de parametru, t:[a,b][0,1], t(u)=, ne conduce la paramatizarea
(3.13)
Vectorul tangent . În particular, , iar . Deci în (3.13) coeficienții lui , nu reprezintă direcția tangentei în u = a, respectiv u = b, adică (3.13) nu este parametrizarea unei cubice Hermite, definită pe [a, b].
Dacă (3.10) este parametrizarea unei cubice Hermite definită pe [0, 1], atunci reparametrizarea acesteia în baza Hermite, definită pe [a, b] este:
,
(3.14)
unde .
Exprimarea unei cubice în forma Hermite nu este simetrică, în sensul că dacă în (8.10) înlocuim t cu 1-t, nu obținem aceeași curbă, adică h(t) și h(1-t) nu parametrizează aceeași curbă.
În continuare studiem influența vectorilor , asupra formei curbei. Presupunem că:
și (8.15)
și (8.16)
Numerele 0, 1 se numesc parametri de design ai cubicei Hermite. Ținând seama că avem că
(3.17)
Deci
(3.18)
Evident matricea este nesingulară și deci sistemul
(3.19)
are soluție unică (X(t), Y(t), Z(t))
(3.20)
Prin urmare parametrii 0, 1 influențează poziția punctelor curbei
față de punctul inițial p0 (Fig. 3.2).
Fig 3.1 Influența schimbării vectorului tangent
în extremitatea stângă asupra formei curbei.
III.2 Suprafețe bicubice Hermite
Matricea geometrică a unei suprafețe Hermite
Fie S = im s o suprafață bicubică parametrizată prin:
(3.21)
sau în forma matricială:
(3.22)
Matricea de puncte se numește matricea coeficienților algebrici, deoarece punctele aij nu au o semnificație geometrică.
Vom arăta în continuare că exprimarea aplicației polinomiale s în baza Hermite, adică în forma:
(3.23)
conduce la o matrice (hij) ale cărei elemente caracterizează geometric suprafața.
Mai precis cele 16 elemente ale matricii (hij) vor fi (Fig. 8.3):
(3.24)
Precizăm că sensul vectorilor , este dictat de sensul de parcurs al curbelor coordonate u = i, v = j, i, j {0, 1}. De exemplu pe curba v = 0 sensul este “dinspre u = 0 înspre u = 1”.
Propoziția 3.1 Matricea (hij), i,j = 1,2,3 ce definește parametrizarea
Hermite a unei suprafețe bicubice conține patru sublocuri de tip 22:
(3.25)
Blocul B00 este un bloc de puncte (vârfurile suprafeței), iar celelalte trei blocuri au elementele vectori.
Fig.3.2 Suprafață
Hermite si cele 16
elemente geometrice
Demonstrație: Fie suprafața bicubică S parametrizată în baza Hermite prin (8.23). Curba coordonată v = v0 este parametrizată de
(3.26)
Fiind o curbă cubică, scrierea ei baza Hermite este de forma:
(3.27)
În particular curbele v = 0, v = 1 au parametrizarile
(3.28)
(3.29)
Rescriind (8.27) pentru v0 = v arbitrar, avem:
(3.30)
Derivând (8.30) în raport cu v obținem:
(3.31)
Luând în (8.31) v = 0 și apoi v = 1 obținem:
(3.32)
(3.33)
Analog curba coordonată de pe suprafața (S) corespunzatoare lui u fixat se scrie în baza Hermite:
(3.35)
Derivând în (8.34) în raport cu u avem:
(3.36)
Relația (8.34) o rescriem în forma:
. (3.37)
Dar din (8.28) avem:
, (3.38)
iar din (8.29)
. (3.39)
La fel (8.32) devine:
(3.40)
iar (8.33):
(3.41)
Ținând seama de (8.37-8.40) în (8.36) obținem parametrii suprafeței în baza Hermite
În concluzie, o pânză dreptunghiulară de suprafață bicubică este perfect determinată de coordonatele vârfurilor dreptunghiului curbiliniu, de vectorii tangenți în aceste varfuri la curbele frontieră ale pânzei și de vectorii răsucire în aceste puncte.
Matricea (hij), se numește matricea coeficienților geometrici ai pânzei bicubice.
Vectorii răsucire au o influență neglijabilă asupra formei suprafeței. Modificând blocul B11 din matricea coeficienților geometrici și lăsând neschimbate primele trei, modificarea formei pânzei de suprafață este aproape insesizabilă.
Evaluarea unui punct de pe o curbă coordonată
a unei suprafețe Hermite
Fie curba coordonată v = v0 pe suprafața Hermite:
(3.42)
Parametrizarea curbei este:
(3.43)
Pentru a evalua punctul curbei corespunzător parametrului u = u0 parcurgem etapele:
i) evaluam punctele
(3.44)
Fiecare punct ci(v0), fiind punct pe o cubică Hermite de date inițiale p0 = hi0, p1 = hi1, t0 = hi2, t1 = hi3 se evaluează aplicând algoritmul de Casteljau punctelor Bézier determinate din elementele ce definesc cubica Hermite:
(3.45)
si parametrului v0;
ii) punctul se evaluează aplicând din nou algoritmul de Casteljau punctelor Bézier:
(3.46)
și parametrului u0.
Practic această modalitate de evaluare a unui punct, ascunde modul de evaluare unui punct pe suprafața bicubică exprimată în baza Bernstein (forma Bézier). Ținând seama de relația (8.9), dintre baza Hermite și baza Bernstein, parametrizarea suprafeței bicubice devine:
(3.47)
unde
(3.48)
Observația 3.1 Efectuând produsul celor trei matrici observăm că doar punctele Bézier b11, b12, b21, b22 depind de vectorii de rasucire h22, h23, h32, h33 și anume:
Prin urmare, contribuția vectorilor rasucire la geometriei suprafeței este redusă, drept pentru care în numeroase situații acești vectori se aleg ca fiind vectorii nuli.
Capitolul IV
PREZENTARE GENERALĂ A APLICAȚIEI
Câte ceva despre tema lucrării. Această aplicație este un mod de prezentare atât a curbelor cât și a suprafețelor Bézier. Reprezentarea curbelor Bézier în baza Bernstein si numele acestor curbe sunt datorate lui Bézier, inginer la Citroen. De Casteljau a dat o definiție procedurală a curbelor Bézier.
Lucrarile lui de Casteljau privind această problematică au fost elaborate înaintea celor ale lui Bézier, dar nu au fost niciodată publicate, ci au fost păstrate sub forma unor rapoate tehnice ale firmei Citroen. Rapoartele au devenit cunoscute cu mult mai târziu după conceperea schemei când deja devenise uzuală modalitatea de a defini curbele prin metoda dată de Bézier, folosind exprimarea curbelor în baza Bernstein. Astfel aceste curbe poartă doar numele lui Bézier.
Aplicația prezintă atât polinomul Bézier cât și curbele și suprafețele Bézier. Pentru prezentarea celor din urmă folosește algoritmii lui Casteljau. Este o aplicație scrisă în limbajul de programare C++ și încearcă o interfață cât mai atrăgătoare și ușor de folosit : prin cuvintele de ajutor plasate în interiorul ei, printr-un meniu ușor de folosit, prin optiunile clare și concrete din meniu și prin oferirea posibilității de folosire a mouse-lui.
Această aplicație are un meniu principal cu trei obțiuni, care de fapt sunt temele celor trei capitole din lucrarea căreia îi este atașată.
Alegerea opțiunii care ne interesează se face cu ajutorul tastelor ”Sus ” sau ”Jos”, care vor modifica poziția cursorului-opțiune și implicit opțiunea care o alegem. Finalizarea alegerii opțiunii se face prin apăsarea tastei ”Enter” ; iar părăsirea aplicației prin tasta ”Esc”.
Cele trei opțiuni generale sunt:
► CURBE
► SUPRAFEȚE
► INTERPOLARE HERMITE
În cazul în care am ales prima opțiune și anume ”CURBE” avem un submeniu și anume :
◄ POLINOAME BERNSTEIN
◄ CURBE BÉZIER
Acest submeniu păstrează modul de folosire al meniului principal dând o modalitate ușoară de folosire și o diferențiere a curbelor Bézier de Polinoane Bernstein.
Opțiunea POLINOAME BERNSTEIN va desena, în funcție de gradul acestuia curbele asociate într-un sistem 2D, XΘY.
Opțiunea CURBE BÉZIER oferă la rândul ei două opțiuni fiind dedicată desenării curbelor atât în sistemul 2D cât și în sistemul 3D.
Este ușor de înțeles că cele două opțiuni sunt :
◄ PREZENTARE 2D
◄ PREZENTARE 3D
Opțiunea ”PREZENTARE 2D” este dedicată ușurării citirii datelor de intrare, deoarece prezintă un sistem 2D, xΘy în interiorul căruia vârfurile poligonului de control al curbei Bézier sunt marcate cu un simplu clic stânga după poziționarea mouse-lui în punctul dorit. Terminarea marcării vârfurilor poligonului se face printr-un clic dreapta, duplicând totodată și trasarea poligonului și a curbei Bézier.
Opțiunea ”PREZENTAREA 3D” permite alegerea unor seturi de date ce vor prezenta un sistem 3D, curbele definite de ele cât și o opțiune de introducere a datelor de intrare. În acest caz datele sunt punctate, și vor fi citite coordonată cu coordonată, ceea ce este un sistem mai greu datele de intrare fiind mai multe, dar uneori necesar.
Astfel prima opțiune a meniului principal și anume ”CURBE” oferă atât două moduri de citire a datelor cât și două moduri de prezentare a curbelor Bézier.
Cea de-a doua opțiune și anume ”SUPRAFEȚE BÉZIER”, oferă o presentare 3D a suprafețelor Bézier prin introducerea datelor de la tastatură, dar avându-se oportunitatea unor seturi predefinite.
Opeațiunea a treia ”INTERPOPARE HERMITE” apelează din nou la modul de citire a datelor cu mouse-ul. Prezintă un sistem 2D, xΘy în interiorul căreia se punctează baza și vârful vectorilor care vor defini atât poligonul de control cât și curba Bézier.
Astfel citirea vectorilor se va face: bază, vârf (prin punctarea lor cu un clic stânga) unul câte unul și incheierea citirii acestora printr-un clic dreapta.
Acest mod de citire foarte ușor și implicit prin incheierea vectorilor aplicația v-a prezenta poligonul și curba Bézier rezultante.
Aceasta este o prezentare generală a aplicației și opțiunilor oferite de ea. În principiu este baza prezentării acestor curbe și suprafețe care au ajutat firma Citroen să dezvolte modele cât mai atrăgătoare și mai impunătoare pe piața construcților de mașini.
Descrierea aplicației pe funcții. Aplicatia apelează la un joc de mai multe meniuri pentru a putea crea un obiect destul de clar la care se referă.
Astfel funcția main incepe prin folosirea funcției initGraph care va initia modul graphic și va da un semnal sonor in cayul in care aceasta a reusit sau va afișa un mesaj pe ecran in cazul unui eșec.
Într-o structură repetitivă, dupa o curațire a ecranului, variabila figure va lua valoarea returnată de funcția Menu() care, de fapt, generează meniul principal. În cadrul acestui meniu, la apăsarea tastelor “SUS” sau “JOS” se schimbă poziția cursorului opțiune( implicit și opțiunea aleasă), finalizarea opțiunii aleasă se face prin apăsarea tastei “ENTER” și se oferă posibilitatea de ieșire din aplicație prin tasta “ESC”.
Totodată această funcție ce reprezintă meniul principal împarte și aplicația în concordanță cu cele trei capitole ale lucrării.
Variabila figure în functie de valoarea care o are va porni noi instrucțiuni, funcții sau meniuri astfel:
valoarea 0: va rula o rutina identical ca principiu. Astfel variabila curbe (sugestivă pentru opțiunea aleasă) va avea valoarea returnată de functia CurbeMenu().
În cazul în care aceasta e egală cu 0 s-a ales opțiunea “POLINOMUL BERNSTEIN” și după o curățire a ecranului se face citirea gradului polinomuli și implicit apoi se desenează curbele rezultate. Pentru trasarea curbelor se apelează la funcția Bernstein(int n, int nr_puncte). Aceasta din urmă are nevoie la rândul ei de funcția ajutatoare Combinari(int n, int i).
Pentru un polinom de grad 5 programul va afisa următorul lucruȘ
În cazul în care aceasta e egală cu 1 s-a ales opțiunea “CURBE BEZIER” și se intră intr-un nou meniu de alegere a modului prezentării. Variabila dim va lua valoarea returnată de funcția submeniu CastMenu(). Aceasta ne permite alegerea prezentării 2D sau 3D. În cazul în care s-a ales
PREZENTARE 2D se initializează mouse-ul. Acest lucru se face cu ajutorul funcțiilor initmouse() și mouseon(), apoi se apelează funcția inițializare2D. Aceasta e foarte importantă datorită faptului ca pe lângă trasarea sistemului de coordonate stabileste și o scară de raport între coordonate reale și coordonatele ecran.
Toate corelațiile între coordonate sunt realizate sunt realizate pe baza acestei scări de raport prin funcțiile xe()-returnează coordonata ecran X în funcție de coordonata reală X, ye()-returnează coordonata ecran Y în funcție de coordonata reală Y, xr()-returnează coordonata reală X în funcție de coordonata ecran X, yr()-returnează coordonata reală Y în funcție de coordonata ecran Y.
Într-o structură v cu două câmpuri x și y se rețin la fiecare apăsare a butonului din stânga mouse (apăsare sesizată prin funcția mouseleftreleased()) coordonatele mouse-lui care devin punct pe ecran și varf al poligonului de control. La clic dreapta (apăsare sesizată prin funcția mouserightreleased()) vârfurile poligonului de contol au fost marcate și se încheie etapa de citire a acestora. Se trasează poligonul de control punct cu punct după care urmează apelarea funcției DeCasteljau() ce va contura punct cu punct curba Bézier. Așa arată o imagine finală a curbei și polinomului după ce au fost marcate vârfurile polinomului din imagine:
PREZENTARE 3D implică un nou submeniu realizat de funcția Menu3D(). Aceasta oferă posibilitate de a alege 2 seturi de date pentru avedea un exemplu și a scuti munca utilizatorului de a introduce date, dar lasă acestuia și posibilitatea de a-și defini singur curba in functie de datele care le introduce.
valoarea 1: determină o curațire a ecranului, apoi aplicarea functiei initializare3D() care va tresa un sistem 3D și va stabili scara de raport pentru concordanța între coordonatele reale și coordonatele ecran. Se va apela apoi funcția suprafata_Bezier() care se va folosi si ea de funcția DeCasteljau() și va trasa suprafața determinata de datele introduse. Urmatoarele două imagini prezintă două suprafețe Bezier; una de dimensiune 2-2 și cealaltă de dimensiune 2-3.
valoarea 2: va apela și ea la funcția initializare2D() stabilindu-se o scară de corelare a coordonatelor și trasându-se un sistem XOY. Se face aceeași citire a punctelor pe ecran în strunctura v cu câmpurile x și y. Ținând cont că acum se citeste baza și apoi varful vectorului se aleg din structura v în două tablouri coordonatele bazelor și apoi vârfurilor vrctorilor punctați cu mose-le după aceeași regulă ca și până acum. Se apelează dupa unirea tuturor nodurilor pare din structura v, noduri ce reprezintă poligonul, funcția interpolare_Hermite() care va trasa curba definita de acesti vectori. Așa arata o citire a datelor inainte de punctarea curbei rezultate din vectorii prezentați în imagine:
În continuare prezint codul pentru aplicația descrisă anterior:
#include<graphics.h>
#include<conio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<iostream.h>
#include<math.h>
#define nmax 50
double f=0.5,teta=M_PI/4;
float ps[3][20][20];
typedef struct punct
{ int x;
int y;
}punct;
typedef punct poligon[nmax];
poligon v,b;
int n,m;
float p[2][nmax];
//functii care ajuta la desenatul poligonului cu mouse-ul
void initmouse(){
struct REGPACK r;
r.r_ax=0;
intr(51,&r);
}
void mouseon(){
struct REGPACK r;
r.r_ax=1;
intr(51,&r);
}
int mousex(){
struct REGPACK r;
r.r_ax=3;
intr(51,&r);
return (r.r_cx);
}
int mousey(){
struct REGPACK r;
r.r_ax=3;
intr(51,&r);
return (r.r_dx);
}
int mouseleftreleased(){
struct REGPACK r;
r.r_ax=6;
r.r_bx=0;
intr(51,&r);
return ((r.r_bx&1)==1);
}
int mouserightreleased(){
struct REGPACK r;
r.r_ax=6;
r.r_bx=1;
intr(51,&r);
return ((r.r_bx&1)==1);
}
//incheierea functiilor pentru mouse
//functii pentru corelare coordonate ecran si coordonate reale
double xrmin,yrmin,xrmax,yrmax,Sx,Sy;
int xemin,yemin,xemax,yemax;
int xe(double xr){
return(xemin+Sx*(xr-xrmin));
}
int ye(double yr){
return(yemax-Sy*(yr-yrmin));
}
float xr(int xe){
return ((xe-xemin)/Sx+xrmin);
}
float yr(int ye){
return ((yemax-ye)/Sy+yrmin);
}
void rline(double x1,double y1,double x2,double y2){
line(xe(x1),ye(y1),xe(x2),ye(y2));
}
void rmoveto(double x,double y){
moveto(xe(x),ye(y));
}
void rlineto(double x,double y){
lineto (xe(x),ye(y));
}
double xp(double x, double y, double z){
return y-f*cos(teta)*x;
}
double yp(double x ,double y, double z ){
return z-f*sin(teta)*x;
}
void initializare2D(double xRmin,double yRmin,double xRmax,double yRmax, int xEmin,int yEmin,int xEmax,int yEmax){
xrmin=xRmin;
xrmax=xRmax;
yrmin=yRmin;
yrmax=yRmax;
xemin=xEmin;
xemax=xEmax;
yemin=yEmin;
yemax=yEmax;
Sx=(xemax-xemin)/(xrmax-xrmin);
Sy=(yemax-yemin)/(yrmax-yrmin);
setcolor(15);
rline(xrmin,0,xrmax,0);
rline(0,yrmin,0,yrmax);
setcolor(15); settextstyle(7,0,2);
outtextxy(xe(xrmax),ye(0),"X");
outtextxy(xe(0)+5,ye(yrmax),"Y");
}
void initializare3D(double xRmin,double yRmin,double xRmax,double yRmax, int xEmin,int yEmin,int xEmax,int yEmax){
xrmin=xRmin;
xrmax=xRmax;
yrmin=yRmin;
yrmax=yRmax;
xemin=xEmin;
xemax=xEmax;
yemin=yEmin;
yemax=yEmax;
Sx=(xemax-xemin)/(xrmax-xrmin);
Sy=(yemax-yemin)/(yrmax-yrmin);
setcolor(15);
rline(xp(0,0,0),yp(0,0,0),xp(1,0,0),yp(1,0,0));
rline(xp(0,0,0),yp(0,0,0),xp(0,1,0),yp(0,1,0));
rline(xp(0,0,0),yp(0,0,0),xp(0,0,1),yp(0,0,1));
outtextxy(xe(xp(1,0,0)),ye(yp(1,0,0)),"X");
outtextxy(xe(xp(0,1,0)),ye(yp(0,1,0)),"Y");
outtextxy(xe(xp(0,0,1)),ye(yp(0,0,1)),"Z");
}
//incheierea functiilor pentru coordonateecran-coordonate reale
//functiile pentru baza bernstein
float combinari(int n,int i){
float comb=1.;
int k;
for(k=1;k<=i;k++)
comb=comb*(n-i+k)/k;
return comb;
}
void Bernstein(int n,int nr_puncte){
float t,past=1./nr_puncte,ft;
for(int i=0;i<=n;i++){
setcolor(i+1);
for(t=0.01;t<1;t+=past){
ft=combinari(n,i)*pow(t,i)*pow(1-t,n-i);
putpixel(xe(t),ye(ft),i+1);
}
}
}
//incheiere functiilor pentru baza bernstein
//functii pentru algoritmul DeCasteljau
void rputpixel(double x,double y,int culoare){
putpixel(xe(x),ye(y),culoare);
}
void desenare_poligon_control(int dim,int m,float q[3][nmax]){
initializare3D(-5,-5,5,5,0,0,400,400);
setcolor(9);
rmoveto(xp(q[0][0],q[1][0],q[2][0]),yp(q[0][0],q[1][0],q[2][0]));
for(int i=1;i<=m;i++)
rlineto(xp(q[0][i],q[1][i],q[2][i]),yp(q[0][i],q[1][i],q[2][i]));
}
void deseneaza_punct(int dim,float q[3],int culoare){
if(dim==2)
rputpixel(q[0],q[1],culoare);
else
rputpixel(xp(q[0],q[1],q[2]),yp(q[0],q[1],q[2]),culoare);
}
void DeCasteljau(int dim,int n,float p[3][nmax],int culoare){
float t,past=0.001,aux[3][nmax];
int i,j,s,r;
float punct[3];
for(t=0;t<=1;t+=past){
//se initializeaza tabloul aux
for(i=0;i<n;i++)
for (j=0;j<dim;j++)
aux[j][i]=p[j][i];
for (s=1;s<n;s++)
for(r=0;r<n-s;r++)
for (j=0;j<dim;j++)
aux[j][r]=(1-t)*aux[j][r]+t*aux[j][r+1];
for(j=0;j<dim;j++)
punct[j]=aux[j][0];
deseneaza_punct(dim,punct,culoare);
}
}
//sfarsitul functiilor pentru alg DeCasteljau
//functii pentru suprafete bezier
void DeCasteljau_punct(int dim,int n,float p[3][nmax],float t,float punct[3]){
float aux[3][nmax];
int i,j,s,r;
//se initializeaza tabloul aux
for(i=0;i<=n;i++)
for (j=0;j<dim;j++)
aux[j][i]=p[j][i];
for (s=1;s<=n;s++)
for(r=0;r<=n-s;r++)
for (j=0;j<dim;j++)
aux[j][r]=(1-t)*aux[j][r]+t*aux[j][r+1];
for(j=0;j<dim;j++)
punct[j]=aux[j][0];
}
void suprafata_Bezier(int nu,int nv,int c1,int c2)
{
float u,l,pasu=1./nu,pasv=1./nv,d[3][nmax],aux[3][nmax],punct[3];
int i,j,k;
for(u=0;u<=1;u+=pasu)
{
for(j=0;j<=m;j++)
{
for(i=0;i<=n;i++)
for(k=0;k<3;k++)
aux[k][i]=ps[k][i][j];
DeCasteljau_punct(3,n,aux,u,punct);
for(k=0;k<3;k++)
d[k][j]=punct[k];
}
DeCasteljau(3,m,d,c1);
}
for(l=0;l<=1;l+=pasv)
{
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
for(k=0;k<3;k++)
aux[k][j]=ps[k][i][j];
DeCasteljau_punct(3,m,aux,l,punct);
for(k=0;k<3;k++)
d[k][i]=punct[k];
}
DeCasteljau(3,n,d,c2);
}
}
void citire(){
int i,j;
printf("gradul suprafetei: \nn= "); scanf("%d",&n);
printf("m=");scanf("%d",&m);
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
for(int k=0;k<3;k++){
printf("p[ %d][ %d][ %d]=",k,i,j); scanf("%f",&ps[k][i][j]);
}
}
//functii hermite
void interpolare_Hermite(int dim,int n, float p[3][nmax],float v[3][nmax]){
float q[3][nmax];
for(int i=0;i<n;i++){
for(int j=0;j<dim;j++) q[j][0]=p[j][i];
for(j=0;j<dim;j++) q[j][3]=p[j][i+1];
for(j=0;j<dim;j++) q[j][1]=p[j][i]+v[j][i]/3;
for(j=0;j<dim;j++) q[j][2]=p[j][i+1]-v[j][i+1]/3;
DeCasteljau(dim,3,q,i+1);
}
}
//initializare grafica si meniuri
void initGraph(){
int gd = DETECT, gm, err;
initgraph(&gd,&gm,"c:\\Bc\\BGI");
err = graphresult();
if (err != grOk){
clrscr();
cout<<"Graphic mode not started (ERR NO:"<<err<<" "<<grapherrormsg(err)<<")."<<endl;
exit(1);
}
else{
sound(500);delay(300);nosound();
}
}
int Menu(){
setcolor(10); settextstyle(7,0,2);
outtextxy(300,100,"Alegeti curbe sau suprafete!");
outtextxy(300,380,"Program realizat de:");
outtextxy(300,420," MANEA CATALIN");
setcolor(11); settextstyle(10,0,2);
outtextxy(320,150,"( ) CURBE ");
outtextxy(320,200,"( ) SUPRAFETE ");
outtextxy(320,250,"( ) INTERPOLARE ");
outtextxy(320,280," HERMITE ");
settextstyle(7,0,2);outtextxy(100,10,"APASATI <ESC> PENTRU IESIRE!!!");
setcolor(14); setfillstyle(1,5); pieslice(335,177,40,320,8);
setfillstyle(1,7); bar(10,50,280,440);
setcolor(6); settextstyle(1,0,1);
outtextxy(30,70 ,"Programul prezinta grafic");
outtextxy(20,90 ,"curbele si suprafetele");
outtextxy(20,110 ,"prezentate in lucrarea");
outtextxy(20,130,"atasata acestuia.");
outtextxy(30,170,"Acest program permite");
outtextxy(20,190,"si prezentarea unor curbe ");
outtextxy(20,210,"definite de utilizator");
outtextxy(20,230,"prin marcarea cu mouse-ul");
outtextxy(20,250,"a punctelor.");
setcolor(8); settextstyle(11,0,3);
outtextxy(30,360,"realizat de: STRUMPH STUDIO");
outtextxy(20,380,"email: [anonimizat]");
char ch;
int option=0;
do{
if (ch==72){
setcolor(0); setfillstyle(1,0);
pieslice(335,177+(50*option),40,320,8);
option–;
if (option==-1) option=2;
setcolor(14); setfillstyle(1,5);
pieslice(335,177+(50*option),40,320,8);
}
if (ch==80){
setcolor(0); setfillstyle(1,0);
pieslice(335,177+(50*option),40,320,8);
option++;
if (option==3) option=0;
setcolor(14); setfillstyle(1,5);
pieslice(335,177+(50*option),40,320,8);
}
if (ch==27){ exit(0);}
ch = getch();
}
while(ch!=13);
return option;
}
int CurbeMenu(){
setcolor(10); settextstyle(7,0,2);
outtextxy(150,100,"Alegeti una dintre cele doua optiuni!");
setcolor(11); settextstyle(10,0,2);
outtextxy(100,200,"( ) POLINOMUL BERNSTEIN ");
outtextxy(100,250,"( ) CURBE BEZIER ");
setcolor(14); setfillstyle(1,5); pieslice(115,227,40,320,8);
setcolor(10); settextstyle(7,0,2);
outtextxy(300,380,"Program realizat de:");
outtextxy(300,420," MANEA CATALIN");
char ch;
int option=0;
do{
if (ch==72){
setcolor(0); setfillstyle(1,0);
pieslice(115,227+(50*option),40,320,8);
if (option==0) option=1;
else option=0;
setcolor(14); setfillstyle(1,5);
pieslice(115,227+(50*option),40,320,8);
}
if (ch==80){
setcolor(0); setfillstyle(1,0);
pieslice(115,227+(50*option),40,320,8);
if (option==0) option=1;
else option=0;
setcolor(14); setfillstyle(1,5);
pieslice(115,227+(50*option),40,320,8);
}
ch = getch();
}
while(ch!=13);
return option;
}
int CastMenu(){
setcolor(10); settextstyle(7,0,2);
outtextxy(200,100,"Alegeti dimensiunea de prezentare!");
setcolor(11); settextstyle(10,0,2);
outtextxy(200,200,"( ) PREZENTARE 2D ");
outtextxy(200,250,"( ) PREZENTARE 3D ");
setcolor(14); setfillstyle(1,5); pieslice(215,227,40,320,8);
setcolor(10); settextstyle(7,0,2);
outtextxy(300,380,"Program realizat de:");
outtextxy(300,420," MANEA CATALIN");
char ch;
int option=0;
do{
if (ch==72){
setcolor(0); setfillstyle(1,0);
pieslice(215,227+(50*option),40,320,8);
if (option==0) option=1;
else option=0;
setcolor(14); setfillstyle(1,5);
pieslice(215,227+(50*option),40,320,8);
}
if (ch==80){
setcolor(0); setfillstyle(1,0);
pieslice(215,227+(50*option),40,320,8);
if (option==0) option=1;
else option=0;
setcolor(14); setfillstyle(1,5);
pieslice(215,227+(50*option),40,320,8);
}
ch = getch();
}
while(ch!=13);
return option;
}
int Menu3D(){
setcolor(10); settextstyle(7,0,2);
outtextxy(10,40,"Alegeti datele!");
setcolor(11); settextstyle(6,0,2);
outtextxy(10,100,"( ) SETUL 1 ");
outtextxy(10,150,"( ) SETUL 2 ");
outtextxy(10,200,"( ) INTRODUCERE ");
outtextxy(10,230," MANUALA ");
setcolor(14); setfillstyle(1,5); pieslice(24,118,40,320,8);
char ch;
int option1=0;
do{
if (ch==72){
setcolor(0); setfillstyle(1,0);
pieslice(24,118+(50*option1),40,320,8);
option1–;
if (option1==-1) option1=2;
setcolor(14); setfillstyle(1,5);
pieslice(24,118+(50*option1),40,320,8);
}
if (ch==80){
setcolor(0); setfillstyle(1,0);
pieslice(24,118+(50*option1),40,320,8);
option1++;
if (option1==3) option1=0;
setcolor(14); setfillstyle(1,5);
pieslice(24,118+(50*option1),40,320,8);
}
ch = getch();
}
while(ch!=13);
return option1;
}
void main(){
initGraph();
int figure, dim, area, x, j, curbe;
char ch;
float baza[2][nmax], var[2][nmax];
while (1){
clearviewport();
figure = Menu();
setfillstyle(1,0);bar(0,0,getmaxx(),getmaxy());
if (figure==0){
curbe = CurbeMenu();
if (curbe==0){
clearviewport();
printf(" n=");
scanf("%d",&n);
initializare2D(0,0,1,1,0,0,400,400);
Bernstein(n,500);
getch();
}
else{
clearviewport();
dim=CastMenu()+2;
if (dim==2) {
clearviewport();
initmouse(); mouseon();
setcolor(11); settextstyle(10,1,3);
outtextxy(500,40,"Punctati poligonul !!!");
setcolor(11); settextstyle(5,0,3);
outtextxy(50,410,"Prin clic stanga marcati varfurile ");
outtextxy(50,430,"Prin clic dreapta incheiati construirea poligonului");
x=0; n=1;
initializare2D(-4,-4,4,4,0,0,400,400);
setcolor(10);
line(0,400,400,400);line(0,402,400,402);
line(400,0,400,400);line(402,0,402,402);
line(0,0,402,0);line(0,2,402,2);
line(0,0,0,402);line(2,0,2,402);
while(1){
while ((j=mouseleftreleased()==0) && (mouserightreleased()==0)) {}
if (j==0){
if(x==0){
v[0].x=mousex();
v[0].y=mousey();
setcolor(3);
putpixel(v[0].x-1,v[0].y-1,3);
p[0][0]=xr(v[0].x); p[1][0]=yr(v[0].y);
x=1; }
else {
v[n].x=mousex();v[n].y=mousey();
putpixel(v[n].x-1,v[n].y-1,3);
p[0][n]=xr(v[n].x); p[1][n]=yr(v[n].y);
n++; }
}
else { break; }
}
}
}
setcolor(9);
moveto(v[0].x,v[0].y);
for (int i=1;i<n;i++)
lineto(v[i].x,v[i].y);
DeCasteljau(2,n,p,14);
}
if (dim==3) {
int option1=Menu3D()+1;
if (option1==1){
n=7;
p[0][0]=4; p[0][1]=3; p[0][2]=3;p[0][3]=3; p[0][4]=-4;p[0][5]=-5;p[0][6]=1;
p[1][0]=-3;p[1][1]=0; p[1][2]=3;p[1][3]=-2;p[1][4]=2; p[1][5]=-6;p[1][6]=2;
p[2][0]=-1;p[2][1]=-3;p[2][2]=2;p[2][3]=2; p[2][4]=-1;p[2][5]=-5;p[2][6]=3;
clearviewport();
desenare_poligon_control(3,n,p);
DeCasteljau(3,n,p,14);
}
if (option1==2){
n=5;
p[0][0]=4;p[0][1]=3;p[0][2]=3; p[0][3]=3; p[0][4]=-4;
p[1][0]=-3;p[1][1]=0; [1][2]=3; p[1][3]=-2;p[1][4]=2;
p[2][0]=-1;p[2][1]=-3; p[2][2]=2; p[2][3]=2; p[2][4]=-1;
clearviewport();
desenare_poligon_control(3,n,p);
DeCasteljau(3,n,p,14);
}
if (option1==3){
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("gradul curbei > "); scanf("%d",&n);
for(int i=0;i<=n;i++)
for(int j=0;j<3;j++)
{
if (j==0) printf("p[ X][ %d]=",i);
if (j==1) printf("p[ Y][ %d]=",i);
if (j==2) printf("p[ Z][ %d]=",i);
scanf("%d",&p[j][i]);
}
clearviewport();
desenare_poligon_control(3,n,p);
DeCasteljau(3,n,p,14);
}
}
if (figure==1) {
clearviewport();
citire();
initializare3D(-2,-2,2,2,0,0,400,400);
suprafata_Bezier(5,4,7,10);
}
if (figure==2) {
clearviewport();
initmouse(); mouseon();
setcolor(11); settextstyle(10,1,3);
outtextxy(500,40,"Punctati vectorii !!!");
setcolor(11); settextstyle(5,0,3);
outtextxy(50,410,"Prin clic stanga marcati bazele si varfurile vectorilor");
outtextxy(50,430,"Prin clic dreapta incheiati construirea poligonului");
x=0; n=1;
initializare2D(-4,-4,4,4,0,0,400,400);
setcolor(10);
line(0,400,400,400);line(0,402,400,402);
line(400,0,400,400);line(402,0,402,402);
line(0,0,402,0);line(0,2,402,2);
line(0,0,0,402);line(2,0,2,402);
while(1){
while ((j=mouseleftreleased()==0) && (mouserightreleased()==0)) {}
if (j==0){
if(x==0){
v[0].x=mousex();
v[0].y=mousey();
setcolor(3);
putpixel(v[0].x-1,v[0].y-1,3);
x=1; }
else {
v[n].x=mousex();v[n].y=mousey();
putpixel(v[n].x-1,v[n].y-1,3);
n++; }
}
else { break; }
}
int lung=0;
for (int i=0;i<n;i+=2)
{
setcolor(9);
if (i<=n-3) line(v[i].x,v[i].y,v[i+2].x,v[i+2].y);
p[0][i]=xr(v[i].x);p[1][i]=xr(v[i].y);
var[0][i+1]=xr(v[i+1].x);var[1][i+1]=xr(v[i+1].y);
circle(v[i+1].x,v[i+1].y,3);
setcolor(8);line(v[i].x,v[i].y,v[i+1].x,v[i+1].y);
lung++;
}
interpolare_Hermite(2,lung,p,var);
}
getch();
clearviewport(); }
closegraph();
}
Bibliografie
1. D. Dogaru, Grafica pe calculator, EDP, București, 1995;
2. M. Vaida, Grafica pe calculator în limbajele Pascal și C,
Ed. Tehnică, București, 1992.
3. E. Petrisor. Modelare geometrica algoritmica.
Ed. Tehnica, Bucuresti, 2001.
4. G. Farin. Courbes et surfaces pour la CAGD, Masson, Paris, 1992.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Curbe Si Suprafete Bezier (ID: 149080)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
