Sidefagssupplering Geometrisk Design, Læseplan Kapitel Her læses afsnit til 4, der drejer sig om polynomielle kurver, specielt Bézier kurver. Der skal især lægges vægt på afsnit 4, som giver en fuldstændig gennemgang af teorien, de foregående afsnit kan betragtes som en indledning. Opgaver:....., vink: vis først at... n k D n k C n k. Øvelser: I Maple lader vi et punkt i planen være givet som en liste med to tal, f.eks. p:=[, ] og vi lader et punkt i rummet være givet som en liste med tre tal, f.eks. p:=[,, -]. En Bézier kurve er givet ved sin kontrolpolygon, og i Maple lader vi en kontrolpolygon og dermed en Bézier kurve være givet ved en liste af punkter, f.eks. a := [[,], [,], [,], [,]]. Man skal være opmærksom på at Maple tæller fra, så vi har f.eks. a[] := [,]. I bogen er det første punkt typisk benævnt a. Man kan altså ikke uden videre bruge algoritmerne i bogen men skal omhyggeligt tænke over hvilke index der skal bruges. Følgende Maple kommandoer er bekvemme ved arbejde med lister: > a := [[,], [,], [,], [,]] a VD TT U T U T U T UU > b := [[,], [,], [,], [,4], [,]] antal punkter i listen: b VD TT U T U T U T 4U T UU > nops(a), nops(b) Udpakning af en liste: > op(a) 4 5 T U T U T U T U
Del af en liste ( refererer til sidste element): > b[..-] To lister slås sammen: TT U T U T 4U T UU > [op(a),op(b[..-])] TT U T U T U T U T U T U T 4U T UU Nedenfor bruges en del kommandoer på formen plots[kommando], man kan nøjes med kommando, hvis man har brugt kommandoen with(plots) først. Skriv et Maple -program, der ved hjælp af rekursionsligningen (.) udregner Bernstein polynomierne af en given grad. Der ønskes følgende skelet for proceduren Bernstein: > Bernstein := proc(n) > B:=Bernstein() B VD Tt!. t/ t!. t/ t t!. t/t t! t U Vi kan nu definerer en Bézier kurve ved > a := [[,], [,], [,], [,]]: > r := expand( sum(b[k](t)*a[k], k=..4) ) r VD T4t C t 6t t C tu expand er nødvendig for at få Maple til at gange ind i de kantede parenteser. Vi bruger Maple s plot-kommando til at bestemme kurvens graf og Maple s pointplot-kommando til kontrolpolygonen > curve := plot([r[], r[], t=..], thickness=, color=black): > ctr := plots[pointplot](a, connect=true, thickness=, linestyle=dash): > plots[display]([ctr, curve], scaling=constrained)
.7.6.4.....4.6.8 Skriv et Maple -program, der ved hjælp af de Casteljau s algoritme bestemmer et punkt på en Bézier kurve: > decasteljau := proc(c, t) > a := [[,], [,], [,], [,]]: > b := [[,,], [,,], [,,], [,,], [,,]]: > decasteljau(a, ) T:5 :75U > decasteljau(b, ) T:875 :6875 :5U Vi kan plotte rum-kurven ved at udregne en række punkter på den og bruge Maple -kommandoen pointplotd til både kurven og kontrolpolygonen > rr := [seq(decasteljau(b, i*.5), i=..)]: > curve := plots[pointplotd](rr, connect=true, color=black, thickness=): > ctr := plots[pointplotd](b, connect=true, color=black, thickness=, > linestyle=dash): > plots[display]([ctr, curve], axes=boxed, scaling=constrained).8.6.4....4.4.6.8.8.6
Skriv et Maple -program der differentierer en Bézier kurve: > BezierDiff := proc(c) > a := [[,], [,], [,], [,]]: > da := BezierDiff(a) da VD TT U T U T UU Skriv et Maple -program der øger graden af en Bézier kurve: > DegRaise := proc(c) > a := [[,], [,4], [4,4], [4,]]: > DegRaise(a) TT U T U T 4U T4 U T4 UU. Afleveringsopgave Lav et Maple -worksheet med en implementering af subdivision ved en given parameterværdi. Input er en kontrolpolygon c for en Bézier kurve r og en parameterværdi t. Output er et par af kontrolpolygoner Tc c U for henholdvis r jttu og r jtt U. > subdiv := proc(c, t) > a := [[,], [,4], [4,4], [4,]]: > subdiv(a, /) TT U T U T U T UU TT U T U T4 U T4 UU > subdiv(a, /4) 7 T U T U 4 4 5 9 5 9 7 5 8 4 8 4 4 T4 U T4 U 4 Brug derefter subdivision ved (eller :5) et givet antal gange til at approksimerer en Bézier kurve med den subdividerede kontrolpolygon. 4
> subdiv := proc(c, m) > subdiv(a, ) > a := subdiv(a, ) TT U T 4U T4 4U T4 UU a VD TT U T U T U T U T U T4 U T4 UU > a := subdiv(a, ) a VD T U T U 5 4 7 4 4 7 9 8 4 5 9 8 4 4 5 7 4 4 T4 U T4 U T U > a := subdiv(a, ): > a4 := subdiv(a, 4): > p := plots[pointplot](a, connect=true, thickness=, color=black): > p := plots[pointplot](a, connect=true, thickness=, color=red): > p := plots[pointplot](a, connect=true, thickness=, color=green): > p := plots[pointplot](a, connect=true, thickness=, color=blue): > p4 := plots[pointplot](a4, connect=true, thickness=, color=red): > plots[display]([p, p, p, p, p4], scaling=constrained, axes=none) 5
Kapitel Her læses afsnit til 4, der drejer sig om kurver i planen og rummet. Opgaver:.... Lad r.t/ være en regulær kurve med buelængde s, tangentvektor t og krumningsvektor D dt. Vis, at Gram-Schmidt ortonormalisrings proceduren ds anvendt på vektorerne r og r giver det ortonormale sæt hvor t w jwj w D jr j r.r r /r jr j og jwj D jr j jr j.r r / jr j : Vis dernæst, ved at benytte d ds D dt d ds dt, at D dt ds D d t ds r C r jr j så w D jr j jr j.r r / jr j 4 Vis, at? t, så D w jwj w D Vis at djj dt w, og dermed, at jr j D jwj jr j : D jr j r.r r /r jr j 4 og jj D jr j jr j.r r / jr j 6 () D jr j 4.r r / jr j.r r /.r r / 6jr j jr j.r r / C 6.r r / jr j 8 og at d dt D Tr r r.4/ujr r j Tr r r U.r r /.r r / jr r j 4 6
..5..6.4..4. Øvelser: Bemærk at Maple både har en sum-kommando og en add-kommando, og at sum kan give uventede resultater: > p := [,, ]: > r := t -> sum(binomial(,k)*(-t)^(-k)*t^k*p[k+], k=..): > r := t -> add(binomial(,k)*(-t)^(-k)*t^k*p[k+], k=..): > r(),r(.5),r(),r(),r(.5),r() : : I kommandoen r der bruger sum bliver k sat lig, før k bliver sat til. Skriv et Maple program der ved hjælp af numerisk integration (brug evalf) bestemmer længden af en Bézier kurve. > Bernstein := proc(n) > BezierDiff := proc(c) > BezierLength := proc(c) > a := [[,], [,], [,], [,]]: > BezierLength(a) Skriv et Maple program der for en Bézier kurve af grad n finder :. Længden ` p af kontrolpolygonen.. Afstanden `c mellem endepunkterne. Det vægtede gennemsnit.`c C.n /` p/=.n C /. 7
Sammenlign med resultatet af foregående øvelse og undersøg hvad der sker under gentagen subdivision. > BezierLength := proc(c) > BezierLength(a) T: : :U > subdiv := proc(c, t) > BezierLength := proc(c, n) > local cc > if n= then > return(bezierlength(c)) > else > cc:=subdiv(c,.5) > return(bezierlength(cc[], n-)+bezierlength(cc[], n-)) > fi > BezierLength(a, ) > BezierLength(a, ) > BezierLength(a, ) > BezierLength(a, ) > BezierLength(a, 4) T: : :U T:7678 :877568 :494U T:49794 :9579 :5658U T:6 :9877584 :5976U T:77 :996967 :998U 8
Skriv et Maple program der finder krumningen i et vilkårligt punkt af en plan Bézier kurve. > BezierCurvatured := proc(c, t) > BezierCurvatured(a, ), BezierCurvatured(a,.5) :666666667 :666666667 Skriv et Maple program der ved hjælp af () finder krumningsvektoren i et vilkårligt punkt af en Bézier kurve. > BezierCurvatureVector := proc(c, t) > b := [[,,], [,,], [,,], [,,], [,,]]: > BezierCurvatureVector(b,.5) 4 Skriv et Maple program der ved hjælp af () finder længden af krumningsvektoren i et vilkårligt punkt af en Bézier kurve. > BezierCurvature := proc(c, t) > BezierCurvature(b,.5) :6996 Skriv et Maple program der finder torsionen i et vilkårligt punkt af en Bézier kurve i rummet. > BezierTorsion := proc(c, t) > BezierTorsion(b, ),BezierTorsion(b, /),BezierTorsion(b, ) 9
Skriv et Maple program der bestemmer parameterfremstillingen med tangentdrejning for en kurve med den naturlige ligning ds D %.'/ i det tilfælde hvor %.'/ er et polynomium. > PlaneCurve := proc(p, r, ii) > # p en funktion (et polynomium) > # r startpunktet > # ii parameter intervallet > p := t->(t/pi)^ - (t/pi)^ + : > r := PlaneCurve(p, [,],..*Pi) r VD t!.t 6 t / cos.t / d' C.t 6t t C C / sin.t / C 6 t!.6t t C t / cos.t / C.t 6 t / sin.t / C > plot([op(r),..*pi], scaling=constrained]) C.5.5
Lav et Maple -worksheet der kan. Afleveringsopgave. Plotte krumningen som funktion af buelængden for en vilkårlig Bézier kurve.. Plotte torsionen som funktion af buelængden for en vilkårlig Bézier kurve i rummet. Vi skal altså plotte jj og som funktion af s, dvs. kurverne givet ved.s j.s/j/ og.s.s//. Disse kan også parametriseres som.s.t/ j.t/j/ og.s.t/.t// og det er denne parametrisering vi vil bruge. Hvis vi har en Bézier kurve r.t/ af grad n, så kan vi tilnærme buelængden s.t/ med en kubisk Bézier kurve es der har kontrol punkter s s s s hvor s s D `c C.n /` p n C s s D s./ D jr./j s s D s./ D jr./j bemærk, at s er vilkårlig. Krumningen af r kan vi tilnærme med en kubisk Bézier kurve e der har kontrol punkter hvor D j./j D dj./j D dt dj./j D j./j dt bemærk, at djj D djj. Fuldstændigt tilsvarende kan der findes en kubisk dt jj dt tilnærmelse til torsionen. Først implementeres dette. Vi definerer allerførst et par hjælpe kommandoer (prik- og kryds-produkt) > dot := proc(x,y) > local k > return(add(x[k]*y[k], k=..nops(x))) > cross := proc(x,y) > return(convert(linalg[crossprod](x,y), list)) > a := [[,], [,], [,], [,]]: > b := [[,,], [,,], [,,], [,,], [,,]]: > BezierLength := proc(c, s)
> local s, s, s,... > return([s,s,s,s]) > BezierLength(a, ) BezierLength(b, ) T : : :U T : :659 :96568544U > BezierCurvature := proc(c) > local k, k, k, k,... > return([k,k,k,k]) > BezierCurvature(a) BezierCurvature(b) T:666666666 :555555556 :555555556 :666666666U T:75 : : :75U > BezierTorsion := proc(c) > local t, t, t, t,... > return([t,t,t,t]) > BezierTorsion(b) 4 4 Disse kommandoer kan nu, i lighed med subdiv-kommandoen fra. afleveringsopgave, kombineres med subdivision til at give en god tilnærmelse til kurverne.s.t/ j.t/j/ og.s.t/.t//. > subdiv := proc(c, t) > BezierCurvaturePlot(c, s, n) > p := BezierCurvaturePlot(a,, ): > p := BezierCurvaturePlot(a,, ): > p := BezierCurvaturePlot(a,, ):
> p := BezierCurvaturePlot(a,, ): > p4 := BezierCurvaturePlot(a,, 4): > pp := plots[pointplot](p, connect=true, thickness=, color=black): > pp := plots[pointplot](p, connect=true, thickness=, color=red): > pp := plots[pointplot](p, connect=true, thickness=, color=green): > pp := plots[pointplot](p, connect=true, thickness=, color=blue): > pp4 := plots[pointplot](p4, connect=true, thickness=, color=red): > plots[display]([pp,pp,pp,pp,pp4]).5.5.5 > p := BezierCurvaturePlot(b,, ): > p := BezierCurvaturePlot(b,, ): > p := BezierCurvaturePlot(b,, ): > p := BezierCurvaturePlot(b,, ): > p4 := BezierCurvaturePlot(b,, 4): > pp := plots[pointplot](p, connect=true, thickness=, color=black): > pp := plots[pointplot](p, connect=true, thickness=, color=red): > pp := plots[pointplot](p, connect=true, thickness=, color=green): > pp := plots[pointplot](p, connect=true, thickness=, color=blue): > pp4 := plots[pointplot](p4, connect=true, thickness=, color=red): > plots[display]([pp,pp,pp,pp,pp4]).8.6.4..8.5.5
> BezierTorsionPlot(c, s, n) > p := BezierTorsionPlot(b,, ): > p := BezierTorsionPlot(b,, ): > p := BezierTorsionPlot(b,, ): > p := BezierTorsionPlot(b,, ): > p4 := BezierTorsionPlot(b,, 4): > pp := plots[pointplot](p, connect=true, thickness=, color=black): > pp := plots[pointplot](p, connect=true, thickness=, color=red): > pp := plots[pointplot](p, connect=true, thickness=, color=green): > pp := plots[pointplot](p, connect=true, thickness=, color=blue): > pp4 := plots[pointplot](p4, connect=true, thickness=, color=red): > plots[display]([pp,pp,pp,pp,pp4]).5.5 4
Kapitel Her læses afsnit til, der drejer sig om tensorprodukt Bézier flader. Opgaver:..4..5 Øvelser: Ligesom vi i kapitel og repræsenterede en Bézier kurve ved en liste af punkter, vil vi her repræsenterer en tensorprodukt Bézier flade ved liste af lister af punkter, f.eks. en bi-kubisk flade: > a := [[[,,/], [,,], [,,], [,,-/]], > [[,,], [,,], [,,], [,,]], > [[,,], [,,], [,,], [,,]], > [[,,-/], [,,], [,,], [,,/]]]: > plots[surfdata](a, style=wireframe, color=black, thickness=, > scaling=constrained, axes=boxed).5.5.5.5 Skriv et Maple program der subdividerer en tensor produkt Bézier flade ved en given værdi af den første parameter, og et der subdividerer ved en given værdi af den anden parameter. > subdiv := proc(c, t) > # Fra kapitel > subdivtensor := proc(c, u) > a := subdivtensor(a, /) 5
a D 4 8 T U T U 4 4 4 4 4 8 4 4 8 4 4 8 5 5 5 5 4 4 [ ] [ ] > pa := plots[surfdata](a, style=wireframe, color=black, thickness=, > linestyle=dash): > p := plots[surfdata](a[], style=wireframe, color=red, thickness=): > p := plots[surfdata](a[], style=wireframe, color=green, thickness=): > plots[display]([pa,p,p], scaling=constrained, axes=boxed).5.5.5.5 > subdivtensor := proc(c, v) > a := subdivtensor(a, /) 6
a D [ ] 4 4 8 4 [ ] 4 4 4 8 5 8 4 4 4 4 4 8 5 5 5 4 [ ] [ ] > p := plots[surfdata](a[], style=wireframe, color=red, thickness=): > p := plots[surfdata](a[], style=wireframe, color=green, thickness=): > plots[display]([pa,p,p], scaling=constrained, axes=boxed).5.5.5.5 Skriv et Maple program som subdividerer en tensor produkt flade n gange i den ene retning og m gange i den anden retning. I begge tilfælde subdivideres ved parameterværdien =. > subdiv := proc(c, n) > # Fra kapitel 7
> subdivtensor := proc(c, n, m) > aa := subdivtensor(a,, ): > p := plots[surfdata](aa, style=wireframe, color=green, thickness=): > plots[display]([pa,p], scaling=constrained, axes=boxed).5.5.5.5 > aa := subdivtensor(a,, ): > p := plots[surfdata](aa, style=wireframe, color=green, thickness=): > plots[display]([pa,p], scaling=constrained, axes=boxed).5.5.5.5 > aa := subdivtensor(a,, ): > p := plots[surfdata](aa, style=wireframe, color=green, thickness=): > plots[display]([pa,p], scaling=constrained, axes=boxed) 8
.5.5.5.5 > aa := subdivtensor(a,, ): > p := plots[surfdata](aa, style=wireframe, color=green, thickness=): > plots[display]([pa,p], scaling=constrained, axes=boxed).5.5.5.5 > p := plots[surfdata](aa, style=patchnogrid): > plots[display]([p,pa], scaling=constrained, axes=boxed).5.5.5.5 9
Skriv to Maple programmer der bestemmer de to partielle afledede af en tensorprodukt Bézier flade. > BezierDiff := proc(c) > # Fra kapitel > TensorBezierDiff := proc(c) > TensorBezierDiff(a) T U T U TT U T U T U T U T U T UU > TensorBezierDiff := proc(c) > TensorBezierDiff(a) T U TT U T U T UU TT U T U T UU T U
Skriv to Maple programmer der hæver graden af en tensorprodukt Bézier flade i hver af de to parametre. > DegRaise := proc(c) > # Fra kapitel > TensorDegRaise := proc(c) > da := TensorBezierDiff(a): > TensorDegRaise(da) T U T U T U T U > TensorDegRaise := proc(c) > da := TensorBezierDiff(a): > TensorDegRaise(da) T U T U T U T U TT U T U T U T UU TT U T U T U T UU
Kapitel 4 Her læses alle afsnit. Opgaver: 4..8, 4..9 og 4..6 4.., 4..4 og 4..6 4.4., 4.4. og 4.4.5 Øvelser: > a := [[[,,/], [,,], [,,], [,,-/]], > [[,,], [,,], [,,], [,,]], > [[,,], [,,], [,,], [,,]], > [[,,-/], [,,], [,,], [,,/]]]: > dot := proc(x,y) > local k > return(add(x[k]*y[k], k=..nops(x))) > cross := proc(x,y) > return(convert(linalg[crossprod](x,y), list)) Skriv et Maple -program der udregner en approximation til normalvektorfeltet på en tensorprodukt Bézier flade. Opfat, efter subdivision, kontrolnettet for de partielle afledede som en approximation til de partielle afledede og benyt disse værdier til at udregne en approximation til normalvekterfeltet. > subdivtensor := proc(c, n, m) > # Fra kapitel > TensorBezierDiff := proc(c) > # Fra kapitel > TensorBezierDiff := proc(c) > # Fra kapitel > TensorDegRaise := proc(c) > # Fra kapitel
> TensorDegRaise := proc(c) > # Fra kapitel > > TensorNormal := proc(c, n, m) > TensorNormal(a,, ) TTT :484894 :484894 :8649658U T :7447 :74688 :74688U T :7447 :74688 :74688U T :484894 :484894 :8649658UU TT:74688 :7447 :74688U T:5445 :5445 :94545U T :5445 :5445 :94545U T :74688 :7447 :74688UU TT:74688 :7447 :74688U T:5445 :5445 :94545U T :5445 :5445 :94545U T :74688 :7447 :74688UU TT:484894 :484894 :8649658U T:7447 :74688 :74688U T:7447 :74688 :74688U T:484894 :484894 :8649658UUU > aa := subdivtensor(a,, ): > p := plots[surfdata](aa, style=wireframe, color=green): > N := TensorNormal(a,, ): > eps:=-.5: # skalering af normalvektor > Np := > plots[display](seq(seq(plottools[arrow]( > aa[i,j],aa[i,j]+eps*n[i,j],.,.,., cylindrical_arrow), > i=..nops(aa)), j=..nops(aa[])), color=black): > plots[display](p, Np, axes=boxed, scaling=constrained)
.5.5.5.5 Skriv et Maple -program der udregner en approximation til første fundamentalform (E, F og G) på en tensorprodukt Bézier flade. Opfat, efter subdivision, kontrolnettet for de partielle afledede som en approximation til de partielle afledede og benyt disse værdier til at udregne en approximation til første fundamentalform. > TensorEFG := proc(c, n, m) > TensorEFG(a,, ) 45 7 7 9 45 4 4 4 4 8 4 8 45 9 45 4 4 4 7 7 45 9 45 8 8 4 4 4 4 4 7 T U T U 4 8 7 T U T U 4 8 7 7 45 9 45 8 8 4 4 4 4 4 Skriv et Maple -program der udregner en approximation til anden fundamentalform (L, M og N) på en tensorprodukt Bézier flade. Opfat, efter subdivision, kontrolnettet for de partielle afledede som en approximation til de partielle afledede og benyt disse værdier til at udregne en approximation til anden fundamentalform. > TensorLMN := proc(c, n, m) > TensorLMN(a,, ) 4
TTT :449489744 :785 :449489744U T4:4899 :6974 :74688U T4:4899 :575 :74688U T:449489744 :674465 :449489744UU TT :74688 :6974 4:4899U T5:474 :5685 5:474U T5:474 :456768 5:474U T:74688 :575 4:4899UU TT:74688 :575 4:4899U T5:474 :456768 5:474U T5:474 :5685 5:474U T :74688 :6974 4:4899UU TT:449489744 :674465 :449489744U T4:4899 :575 :74688U T4:4899 :6974 :74688U T :449489744 :785 :449489744UUU Skriv et Maple -program der udregner en approximation til Gauss krumningen (K ) på en tensorprodukt Bézier flade. Opfat, efter subdivision, kontrolnettet for de partielle afledede som en approximation til de partielle afledede og benyt disse værdier til at udregne en approximation til Gauss krumningen. > TensorGaussKrumning := proc(c, n, m) > TensorGaussKrumning(a,, ) TT :9567856 :788464 :59485 :678959U T :788464 :7895697 :954545454 :59485U T:59485 :954545454 :7895697 :788464U T :678959 :59485 :788464 :9567856UU Skriv et Maple -program der udregner en approximation til Middel krumningen (H) på en tensorprodukt Bézier flade. Opfat, efter subdivision, kon- 5
trolnettet for de partielle afledede som en approximation til de partielle afledede og benyt disse værdier til at udregne en approximation til Middel krumningen. > TensorMiddelKrumning := proc(c, n, m) > TensorMiddelKrumning(a,, ) TT :68468 :9657698 :5684 :5694948U T:9657698 :59674 Hvis vi har givet to n m matricer, p bestående af punkter og c bestående af tal, så plotter følgende Maple -funktion, MyPlot(a, c) punkt-matricen som en flade farvelagt efter tal-matricen, hvor det mindste tal svarer til rød og det største tal svarer til violet. Hvis man angiver to extra tal c og c MyPlot(a, c, c, c) hvor alle tal i c ligger i intervallet Tc c U så kommer c til at svare til rød og c til at scare til violet. > MyPlot := proc(xyz, cc, minc, maxc) > local c, c, c > > c := map(op,cc) > if nargs> then c:=minc else c:=min(op(c)) fi > if nargs> then c:=maxc else c:=max(op(c)) fi > c := map(x->(x-c)*.9/(c-c),c) > PLOTD( MESH(xyz, COLOR(HUE,op(c))), > AXESSTYLE(FRAME), SCALING(CONSTRAINED)) > aa := subdivtensor(a,, ): > K := TensorGaussKrumning(a,, ) > H := TensorMiddelKrumning(a,, ) > HK := op(map(op,k)),op(map(op,h)) > c := min(hk) > c := max(hk) > MyPlot(aa, K, c, c) c VD :88455 c VD :475 6
.5.5.5.5 > MyPlot(aa, H, c, c).5.5.5. Afleveringsopgave.5 Betragt en kurve i xz-planen givet ved en parameterfremstilling I! R V u 7! r.u/ z.u/ med r.u/ > for alle u I. Hvis kurven roteres om z-aksen, får vi en omdrejningsflade. Den kan parametrisers som r.u v/ D r.u/ cos v r.u/ sin v z.u/ Antag nu at kurven r.u/ z.u/ er reulær og injektiv.. Vis at ( ) er et kort hvis v Uv vt med v v <.. Vis at M D r.u v/ u I v R er en regulær flade.. Find enheds normalvektorfeltet til fladen. 4. Bestem første fundamentalform for fladen. 5. Bestem anden fundamentalform for fladen. 6. Bestem Gauss og middel krumningen for fladen. 7. Bestem de principale krumninger og de principale retninger for fladen. ( ) 7