Torma Lídia Boglárka
E3HBW9
Programozási feladat 3.

Virágok függvényekből

Vannak emberek, akik szeretik a virágokat, és vannak, akik a függvényeket. Mégis, kevés embernek jut eszébe kombinálni a kettőt. Karsai János (SZTE egyetemi docens) példáján felbuzdulva tettem fel a kérdést: Miért ne rajzolhatnánk polárkoordinátákkal?

A megfelelő parancs megválasztásánál a ParametricPlot3D-re esett a választásom.

Első körben csak kísérleteztem a formákkal, 2D-s függvényekkel, majd ezeknek testet adtam. A virágokat részekből építettem fel. Elsőként a bimbót, majd a virágok közepét, a termőt rajzoltattam ki. Ezután került sor magára a virágra.

A bimbó

bimbi[x_]:= Exp[-6x^(1/2)]x^(1/2)
ParametricPlot3D[{Cos[u]bimbi[v]+Exp[-v],Sin[u]bimbi[v],-2Sin[v/2]},{u,0,2π},{v,0,π}, PlotRange->1,Axes->None,Mesh->None]

A termő

kozep[x_]:=Cos[2x]
ParametricPlot3D[{Cos[u]kozep[v],Sin[u]kozep[v],Sin[v]Cos[v]},{u,0,2π}, {v,0,π},PlotRange->2]

Az első virág termővel, és négy porzóval:

Virag1[x_]:=1/((x^3-x^2-1/2*x-1))
ParametricPlot3D[{
{Cos[u]Virag1[v],Sin[u]Virag1[v],v},
{Cos[u]bimbi[-v]+Exp[v]/2,Sin[u]bimbi[-v],Sin[v]+0.3},
{Cos[u]bimbi[-v]-Exp[v]/2,Sin[u]bimbi[-v],Sin[v]+0.3},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]+Exp[v]/2,Sin[v]+0.3},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]-Exp[v]/2,Sin[v]+0.3},
{Cos[u]kozep[2v]/2,Sin[u]kozep[2v]/2,Sin[2v]Cos[2v]/2-0.5}
},{u,0,2π},{v,-π/2,0},PlotRange->2,  ColorFunction->Function[{x,y,z,u,v},Hue[-(z-1)(v+0.2)/2]],Boxed->False,Axes->None,Mesh->None]

Az Animate parancs segítségével egy kis életet is tudtam vinni a munkámba. Megfigyeltem, hogyan módosul a tölcsér alakja az együtthatók változtatásával, így ezt felhasználva meg is tudtam valósítani a következő animációt:

Virag11[x_,y_]:=1/((-y)*x^3-1/(-y)*x^2-(-y)/2*x+y)
Animate[ParametricPlot3D[{
{Cos[u]Virag11[v,a],Sin[u]Virag11[v,a],v},
{Cos[u]bimbi[-v]+Exp[v]/a,Sin[u]bimbi[-v],Sin[v]+0.3},
{Cos[u]bimbi[-v]-Exp[v]/a,Sin[u]bimbi[-v],Sin[v]+0.3},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]+Exp[v]/a,Sin[v]+0.3},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]-Exp[v]/a,Sin[v]+0.3},
{-Cos[u]kozep[2v]/2/a,-Sin[u]kozep[2v]/2/a,-Sin[2v]Cos[2v]/a/2-0.5}
},{u,-2π,π},{v,-π/2,0}, PlotRange->2, ColorFunction->Function[{x,y,z,u,v},Hue[-(z-1)(v+0.2)/2]],Boxed->False,Axes->None,Mesh->None],{a,-2.5,-1},AnimationRunning->False]

Az exponenciális függvény tökéletesen alkalmas alapot ad a tölcsérvirág modellezéséhez.

r[x_]:=Exp[-2.5x^(1/2)]
ParametricPlot3D[{Cos[u]r[2v],Sin[u]r[2v],-2v},{u,0,2π},{v,-π/2,π/2}, PlotRange->2, PlotStyle->{Yellow,Specularity[Blue,2]},Axes->None,Mesh->None]

Csak az x (vagy y) koordináta változtatása lehetővé teszi, hogy megdöntsük a tölcsért. Ahhoz, hogy ne egyenletesen,  hanem természetesebb hatást keltve dőljön, szintén exponenciális függvényt használtam. Hasonlóan jártam el a porzókkal az előzőekben, és a későbbiekben egyaránt.

ParametricPlot3D[{Cos[u]r[2v]+Exp[-2v],Sin[u]r[2v],-2v},{u,0,2π},{v,-π/2,π/2}, PlotRange->2, PlotStyle->{Yellow,Specularity[Blue,10]},Axes->None,Mesh->None]

A még megdöntetlen tölcsérből készült virág, négy porzóval

ParametricPlot3D[{
{Cos[u] r[2v],Sin[u] r[2v],-2v},
{Cos[u] bimbi[v]+Exp[-2v],Sin[u] bimbi[v],-Sin[v]+0.5},
{Cos[u] bimbi[v]-Exp[-2v],Sin[u] bimbi[v],-Sin[v]+0.5},
{Cos[u] bimbi[v],Sin[u] bimbi[v]+Exp[-2v],-Sin[v]+0.5},
{Cos[u] bimbi[v],Sin[u] bimbi[v]-Exp[-2v],-Sin[v]+0.5}
},{u,0,2 π},{v,-π/2,π/2},PlotRange->1.5,ColorFunction->Function[{x,y,z,u,v},Hue[v/2]],Boxed->False,Axes->None,Mesh->None]

Színes virágcsokor

ParametricPlot3D[{
{Cos[u]r[2v]+1.5Exp[-2v],Sin[u]r[2v],-2v},
{Cos[u]r[2v]-1.5Exp[-2v],Sin[u]r[2v],-2v},
{Cos[u]r[2v],Sin[u]r[2v]+1.5Exp[-2v],-2v},
{Cos[u]r[2v],Sin[u]r[2v]-1.5Exp[-2v],-2v},
{Cos[u] bimbi[v]+1.5Exp[-v],Sin[u] bimbi[v],-Sin[v]},
{Cos[u] bimbi[v]-1.5Exp[-v],Sin[u] bimbi[v],-Sin[v]},
{Cos[u] bimbi[v],Sin[u] bimbi[v]+1.5Exp[-v],-Sin[v]},
{Cos[u] bimbi[v],Sin[u] bimbi[v]-1.5Exp[-v],-Sin[v]},
{2Cos[u] r[2v],2Sin[u] r[2v],-4v+1},
{2Cos[u] bimbi[v]+2Exp[-2v],2Sin[u] bimbi[v],-Sin[v]+1.5},
{2Cos[u] bimbi[v]-2Exp[-2v],2Sin[u] bimbi[v],-Sin[v]+1.5},
{2Cos[u] bimbi[v],2Sin[u] bimbi[v]+2Exp[-2v],-Sin[v]+1.5},
{2Cos[u] bimbi[v],2Sin[u] bimbi[v]-2Exp[-2v],-Sin[v]+1.5}
},{u,0,2π},{v,-π/2,π/2}, PlotRange->2.5, ColorFunction->Function[{x,y,z,u,v},Hue[v/2]],Boxed->False,Axes->None,Mesh->None]

Hasonlóan a virágcsokorhoz, gombacsoport is kirajzoltatható:

ParametricPlot3D[{
{2Cos[u] r[v]+1.5Exp[-v]/2-0.5,2Sin[u] r[v],-2v+1},
{Cos[u]r[v]+2Exp[-v]-0.5,Sin[u]r[v],-v+0.2},
{Cos[u]r[v]-0.5,Sin[u]r[v]+1.5Exp[-v],-v},
{Cos[u]r[v]-0.5,Sin[u]r[v]-1.5Exp[-v],-v},
{Cos[u]r[v]/2+1.5Exp[-v]/2-0.5,Sin[u]r[v]/2+1.5Exp[-v]/2,-v-0.5},
{Cos[u]r[v]/2+1.5Exp[-v]/2-0.5,Sin[u]r[v]/2-1.5Exp[-v]/2,-v-0.5},
{2Cos[u]r[v]/3+4Exp[-v]/3-0.5,2Sin[u]r[v]/3+Exp[-v]/2,-v-0.7}
},{u,0,2π},{v,-π,π}, PlotRange->2.5, ColorFunction->"DarkRainbow",Boxed->False,Axes->None,Mesh->None]

A lehajló szélű tölcsérhez a legmegfelelőbbnek a négyzetgyök függvény mutatkozott.

r2[x_]:=x^(1/2)
ParametricPlot3D[
{Cos[u]r2[2v],Sin[u]r2[2v],r2[2v]Sin[1.1v]/v/0.6-2},
{u,0,2π}, {v,-π/2,π/2},PlotRange->2,ColorFunction->Function[{x,y,z,u,v},Hue[-(z-1)(v+0.2)/2]],Axes->None,Mesh->None]

A koordinátákat Sin[4v]-vel szorozva négy levélkét kaptam. A Sin függvényt virágszirmok konstruálására is nagyszerűen lehet (és kell is) alkalmazni.

levél[x_, y_]:=r2[2x]*Sin[2y]
ParametricPlot3D[
{1.25Cos[u]levél[v,2u],1.25Sin[u]levél[v,2u],levél[v,2u]Sin[1.1v]/v-2},{u,0,2π}, {v,-π/2,π/2},PlotRange->2,ColorFunction->"AvocadoColors",Axes->None,Mesh->None]

Összerakva a lekonyuló szélű tölcsért, 6 darab levelet és 16 porzót, egy komplett tölcsérvirágot kaptunk.

ParametricPlot3D[{
{Cos[u]r2[2v]0.8,Sin[u]r2[2v]0.8,r2[2v]Sin[1.1v]/v/0.6-2},
{Cos[u]bimbi[v]+Exp[-v^2]/2-0.05,Sin[u]bimbi[v],-Sin[v]},
{Cos[u]bimbi[v]-Exp[-v^2]/2+0.05,Sin[u]bimbi[v],-Sin[v]},
{Cos[u]bimbi[v]+Exp[-v]-0.2,Sin[u]bimbi[v],-Sin[v]},
{Cos[u]bimbi[v]-Exp[-v]+0.2,Sin[u]bimbi[v],-Sin[v]},
{Cos[u]bimbi[v]+Exp[-v^2]/2-0.16,Sin[u]bimbi[v]+Exp[-v^2]/2-0.16,-Sin[v]},
{Cos[u]bimbi[v]-Exp[-v^2]/2+0.16,Sin[u]bimbi[v]-Exp[-v^2]/2+0.16,-Sin[v]},
{Cos[u]bimbi[v]+Exp[-v]-0.32,Sin[u]bimbi[v]+Exp[-v]-0.32,-Sin[v]},
{Cos[u]bimbi[v]-Exp[-v]+0.32,Sin[u]bimbi[v]-Exp[-v]+0.32,-Sin[v]},
{Cos[u]bimbi[v]-Exp[-v^2]/2+0.16,Sin[u]bimbi[v]+Exp[-v^2]/2-0.16,-Sin[v]},
{Cos[u]bimbi[v]+Exp[-v^2]/2-0.16,Sin[u]bimbi[v]-Exp[-v^2]/2+0.16,-Sin[v]},
{Cos[u]bimbi[v]-Exp[-v]+0.32,Sin[u]bimbi[v]+Exp[-v]-0.32,-Sin[v]},
{Cos[u]bimbi[v]+Exp[-v]-0.32,Sin[u]bimbi[v]-Exp[-v]+0.32,-Sin[v]},
{Cos[u]bimbi[v],Sin[u]bimbi[v]+Exp[-v^2]/2-0.05,-Sin[v]},
{Cos[u]bimbi[v],Sin[u]bimbi[v]-Exp[-v^2]/2+0.05,-Sin[v]},
{Cos[u]bimbi[v],Sin[u]bimbi[v]+Exp[-v]-0.2,-Sin[v]},
{Cos[u]bimbi[v],Sin[u]bimbi[v]-Exp[-v]+0.2,-Sin[v]},
{1.25Cos[u]levél[v,3u],1.25Sin[u]levél[v,3u],levél[v,3u]Sin[1.1v]/v-2}
},{u,0,2π}, {v,-π/2,π/2},PlotRange->2,ColorFunction->Function[{x,y,z,u,v},Hue[-(z-1)(v+0.3)/2]],Boxed->False,Axes->None,Mesh->None]

És ha még a tölcsért össze is húzzuk:

ParametricPlot3D[{
{Sin[4u+1]Cos[u]r2[2v-0.2],Sin[4u+1]Sin[u]r2[2v-0.2],r2[2v]Sin[1.1v]/v/0.6-2.7},
{Cos[u]bimbi[v]+Exp[-v^2]/2-0.05,Sin[u]bimbi[v],-Sin[v]-0.5},
{Cos[u]bimbi[v]-Exp[-v^2]/2+0.05,Sin[u]bimbi[v],-Sin[v]-0.5},
{Cos[u]bimbi[v]+Exp[-v]-0.2,Sin[u]bimbi[v],-Sin[v]-0.5},
{Cos[u]bimbi[v]-Exp[-v]+0.2,Sin[u]bimbi[v],-Sin[v]-0.5},
{Cos[u]bimbi[v]+Exp[-v^2]/2-0.16,Sin[u]bimbi[v]+Exp[-v^2]/2-0.16,-Sin[v]-0.5},
{Cos[u]bimbi[v]-Exp[-v^2]/2+0.16,Sin[u]bimbi[v]-Exp[-v^2]/2+0.16,-Sin[v]-0.5},
{Cos[u]bimbi[v]+Exp[-v]-0.32,Sin[u]bimbi[v]+Exp[-v]-0.32,-Sin[v]-0.5},
{Cos[u]bimbi[v]-Exp[-v]+0.32,Sin[u]bimbi[v]-Exp[-v]+0.32,-Sin[v]-0.5},
{Cos[u]bimbi[v]-Exp[-v^2]/2+0.16,Sin[u]bimbi[v]+Exp[-v^2]/2-0.16,-Sin[v]-0.5},
{Cos[u]bimbi[v]+Exp[-v^2]/2-0.16,Sin[u]bimbi[v]-Exp[-v^2]/2+0.16,-Sin[v]-0.5},
{Cos[u]bimbi[v]-Exp[-v]+0.32,Sin[u]bimbi[v]+Exp[-v]-0.32,-Sin[v]-0.5},
{Cos[u]bimbi[v]+Exp[-v]-0.32,Sin[u]bimbi[v]-Exp[-v]+0.32,-Sin[v]-0.5},
{Cos[u]bimbi[v],Sin[u]bimbi[v]+Exp[-v^2]/2-0.05,-Sin[v]-0.5},
{Cos[u]bimbi[v],Sin[u]bimbi[v]-Exp[-v^2]/2+0.05,-Sin[v]-0.5},
{Cos[u]bimbi[v],Sin[u]bimbi[v]+Exp[-v]-0.2,-Sin[v]-0.5},
{Cos[u]bimbi[v],Sin[u]bimbi[v]-Exp[-v]+0.2,-Sin[v]-0.5},
{1.5Cos[u]levél[v,3u],1.5Sin[u]levél[v,3u],levél[v,3u]Sin[1.1v]/v-2}
},{u,0,2π}, {v,-π/2,π/2},PlotRange->2,ColorFunction->"SunsetColors",Boxed->False,Axes->None,Mesh->None]

Egy kis igazítással pillangót is pihentethetünk a virágok szirmain, levelein.

lepke[x_]:=-Exp[Cos[x]]+2*Cos[4*x]-Sin[x/12]^5
ParametricPlot3D[{(Cos[3v]+π/2)*lepke[u-π]Cos[u-π]/10, (Cos[3v]+π/2)*lepke[u-π]Sin[u-π]/10,-Sin[3v]/20},{u,0,2π},{v,-π/2,π/2}, PlotRange->1, ColorFunction->Function[{x,y,z,u,v},Hue[(x/6+1)z]], Boxed->False,Axes->None,Mesh->None]

Virágok pillangóval és anélkül:

ParametricPlot3D[{
{levél[v/2-0.5,2u]Cos[u]0.8,0.8Sin[u]levél[v/2-0.5,2u],r2[v]Sin[0.55v]/v/0.3-2.8},
{1.25Cos[u]levél[v/2,3u],1.25Sin[u]levél[v/2,3u],levél[v/2,3u]Sin[0.55v]/v/0.5-2.3},
{Cos[u]/15,Sin[u]/15,Log[v]/5-0.9},
{Cos[u]kozep[v]/10,Sin[u]kozep[v]/10,Sin[v]Cos[v]/8-0.7},
{(Cos[3v]+π/2)*    lepke[u-π]Cos[u-π]/10+0.5, (Cos[3v]+π/2)*lepke[u-π]Sin[u-π]/10+1.5,Sin[3v]/20-1.05}
},{u,0,2π}, {v,-π,π},PlotRange->2.3,ColorFunction->Function[{x,y,z,u,v},Hue[-(z-1)(v+0.6)/2]],Boxed->False,Axes->None,Mesh->None]

Az exponenciális függvényből kreált tölcsért összehúzva további érdekes formát nyerhetünk, amit forgatással és színezéssel tehetünk még változatosabbá.

ParametricPlot3D[{Cos[u]r[v-0.5]Sin[4u],Sin[u]r[v-0.5]Sin[4u],-v+1},{u,0,2π},{v,-π,π}, PlotRange->1, PlotStyle->{Yellow,Specularity[Pink,1]},Axes->None,Mesh->None]

Az előző formából könnyen megkapjuk a következőket:

ParametricPlot3D[{
{Cos[u+π]r[v-0.5]Sin[4u],Sin[u+π]r[v-0.5]Sin[4u],Sin[u/4]4r[v]-1},
{Cos[u+π/3]r[v-0.5]Sin[4u],Sin[u+π/3]r[v-0.5]Sin[4u],Sin[u/4]4r[v]},
{Cos[u+2π/3]r[v-0.5]Sin[4u],Sin[u+2π/3]r[v-0.5]Sin[4u],Sin[u/4]4r[v]-0.5}},{u,0,2π},{v,-π,π}, PlotRange->1,PlotStyle->{Green, Red, Yellow},Boxed->False,Axes->None,Mesh->None]

ParametricPlot3D[{
{Cos[u+1/π]r[v-0.5]Sin[4u],Sin[u+1/π]r[v-0.5]Sin[4u],Sin[u/4]4r[v]-1},
{Cos[u+π]r[v-0.5]Sin[4u],Sin[u+π]r[v-0.5]Sin[4u],-v+1},
{Cos[u+2/π]r[v-0.5]Sin[4u],Sin[u+2/π]r[v-0.5]Sin[4u],Sin[u/4]4r[v]-0.5},
{-(Cos[3v]+π/2)*lepke[u-π]Cos[u-π]/20, (Cos[3v]+π/2)*lepke[u-π]Sin[u-π]/20+0.5,Sin[3v]/40+0.75}
},{u,0,2π},{v,-π,π}, PlotRange->1,ColorFunction->"Rainbow",Boxed->False,Axes->None,Mesh->None]

Most húzzuk össze a legelső virág szirmait. Teljesen új formát kapunk, ahol már a termő is inkább felülre kerül.

ParametricPlot3D[{
{Sin[4u]Cos[u+3/2/π]Virag1[2v],Sin[4u]Sin[u+3/2/π]Virag1[2v],2v},
{Cos[u]bimbi[-v]+Exp[v]/3,Sin[u]bimbi[-v],Sin[v]+0.2},
{Cos[u]bimbi[-v]-Exp[v]/3,Sin[u]bimbi[-v],Sin[v]+0.2},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]+Exp[v]/3,Sin[v]+0.2},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]-Exp[v]/3,Sin[v]+0.2},
{Cos[u]kozep[2v]/3,Sin[u]kozep[2v]/3,Sin[2v]Cos[2v]/3}
},{u,0,2π},{v,-π/2,0},PlotRange->2,ColorFunction->"Rainbow",ColorFunction->Function[{x,y,z,u,v},Hue[-(z-1)(v+0.2)/2]],Boxed->False,Axes->None,Mesh->None]

Az első virághoz hasonlóan ezt is életre tudjuk kelteni:

Animate[ParametricPlot3D[{
{Sin[4u]Cos[u+3/2/π]/((-a)*8v^3-1/(-a)*4v^2-(-a)*v+a),Sin[4u]Sin[u+3/2/π]/((-a)*8v^3-1/(-a)*4v^2-(-a)*v+a),2v},{Cos[u]bimbi[-v]+Exp[v]/a/2,Sin[u]bimbi[-v],Sin[v]+0.3},
{Cos[u]bimbi[-v]-Exp[v]/a/2,Sin[u]bimbi[-v],Sin[v]+0.3},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]+Exp[v]/2/a,Sin[v]+0.3},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]-Exp[v]/a/2,Sin[v]+0.3},
{-Cos[u]kozep[2v]/4/a,-Sin[u]kozep[2v]/4/a,-Sin[2v]Cos[2v]/a/4}
},{u,-2π,π},{v,-π/2,0}, PlotRange->2, ColorFunction->"Rainbow",ColorFunction->Function[{x,y,z,u,v},Hue[-(z-1)(v+0.2)/2]],Boxed->False,Axes->None,Mesh->None],{a,-2.5,-1},AnimationRunning->False]

Zárásként, az első virágnak leveleket, termőt és porzókat adva, egy pillangóval is gazdagodott az összkép.

ParametricPlot3D[{
{Cos[u]/(v^3-v^2-1/2*v-1),Sin[u]/(v^3-v^2-1/2*v-1),v},
{Cos[u]bimbi[-v]+Exp[v]/2,Sin[u]bimbi[-v],Sin[v]+0.3},
{Cos[u]bimbi[-v]-Exp[v]/2,Sin[u]bimbi[-v],Sin[v]+0.3},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]+Exp[v]/2,Sin[v]+0.3},
{Cos[u]bimbi[-v],Sin[u]bimbi[-v]-Exp[v]/2,Sin[v]+0.3},
{Cos[u]kozep[2v]/2,Sin[u]kozep[2v]/2,Sin[2v]Cos[2v]/2-0.5},
{1.25Cos[u]r2[2(v+π/2)]Sin[10u],1.25Sin[u]r2[2(v+π/2)]Sin[10u],Sin[10u]r2[2(v+π/2)]Sin[1.1(v+π/2)]/(v+π/2)-2},
{(Cos[3v]+π/2)*lepke[u-π]Cos[u-π]/10+1.2, (Cos[3v]+π/2)*lepke[u-π]Sin[u-π]/10+1.2,Sin[3v]/20-0.83}
},{u,0,2π},{v,-π,0},PlotRange->2,  ColorFunction->Function[{x,y,z,u,v},Hue[-(z-1)(v+0.2)/2]],Boxed->False,Axes->None,Mesh->None]

Források:
Ötlet: Karsai János honlapjáról: http://www.model.u-szeged.hu/user/karsai/
The butterfly curve: http://www.seriesmathstudy.com/polargraph.htm