Application Center - Maplesoft

App Preview:

3-D surface models of seashells

You can switch back to the summary page by clicking here.

Learn about Maple
Download Application


 

Seashells.mws

Virtual Seashells

by Alain Goriely, goriely@math.arizona.edu,
( http://www.math.arizona.edu/~goriely)

Abstract: This worksheet show how to represent seashells.
Application Areas/Subjects: Education, Biology, 3D graphics
Keywords: Seashells, 3D plots
Prerequisites: plots

Note: Send me an e-mail (comments-criticisms) if you use this worksheet.

> restart:with(plots):

Warning, the name changecoords has been redefined

Introduction

Seashells can be represented by surfaces in 3D. Their self similar shape can be generated by a simple formula with a certain number of free parameters. Let ( x, y, z ) be a point on the shell. Then, this point can be written in the following form:


x = D*(A*sin(beta)*cos(Theta)+R*cos(s+phi)*cos(Theta+Om...

z = (-A*cos(beta)+R*sin(s+phi)*cos(mu))*exp(Theta*cot(a...

This formula was obtained by A. Cortie and follows a series of basic rotations around the different axes (helical axis, body axis, etc..). In this formula the parameters are:

  • Theta : polar coordinates
  • phi : tilt of ellipse major axis from horizontal plane
  • s : angle on each cross section
  • mu : angle between the plane of the cross section and the helical axis
  • Omega : rotation of the elliptical cross section with respect to the horizonatl plane
  • beta : angle between the helical axis ( z ) and local aperture line
  • R: length of aperture generating curve (can itself be a function of parameters and s to have a nonuniform cross sections
  • a: major semiaxis of the elliptical cross section
  • b: minor semiaxis
  • D: sense of coiling

The following worksheet is a straightforward application of this formula for different typical shapes of seashells. It is not a profound exercice (it is actually straightforwad).

Just try to have fun with virtual seashells! I

f anybody has the courage to do it, it would be nice to transform these plots in vrml (easy) and apply realistic textures files (harder). It would be nice to have a real 3D virtual seashells museum in vrml (let me know!).

The model

> rad:=proc(aa) aa/360*2*Pi end:

> x:=D*(A*sin(beta)*cos(Theta)+R*cos(s+phi)*cos(Theta+Omega)-R*sin(mu)*sin(s+phi)*sin(Theta+Omega))*exp(Theta*cot(alpha)):
y:=(-A*sin(beta)*sin(Theta)-R*cos(s+phi)*sin(Theta+Omega)-R*sin(mu)*sin(s+phi)*cos(Theta+Omega))*exp(Theta*cot(alpha)):
z:=(-A*cos(beta)+R*sin(s+phi)*cos(mu))*exp(Theta*cot(alpha)):

> SR:=R=RE+k;
SRE:=RE=1/sqrt(cos(s)^2/a^2+sin(s)^2/b^2);
Sk:=k=L*exp(-(2*(s-P)/W[1])^2)*exp(-(2*g/W[2])^2);
Sg:=g=2*Pi/N*(Theta*N/2/Pi-round(Theta*N/2/Pi));

SR := R = RE+k

SRE := RE = 1/(sqrt(cos(s)^2/(a^2)+sin(s)^2/(b^2)))...

Sk := k = L*exp(-4*(s-P)^2/(W[1]^2))*exp(-4*g^2/(W[...

Sg := g = 2*Pi*(1/2*Theta*N/Pi-round(1/2*Theta*N/Pi...

Natalina

> S:={D=1,alpha=rad(80),beta=rad(40),phi=rad(55),mu=rad(10), Omega=rad(30),smM=rad(-270)..rad(80),A=25,a=12,b=16,P=0,L=0};
R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):

S := {phi = 11/36*Pi, mu = 1/18*Pi, smM = -3/2*Pi ....

> plot3d(R1,s=subs(S,smM),Theta=-2*Pi..4*Pi,grid=[100,100],style=patchnogrid,scaling=constrained,orientation=[-68,80],lightmodel=light2,shading=xy);

[Maple Plot]

> #plot3d(R1,s=subs(S,smM),Theta=-2*Pi..4*Pi,grid=[40,60],scaling=constrained,orientation=[-68,67],color=(sin(5*s))^2,style=patchnogrid,orientation=[-68,80],lightmodel=light2,shading=xy);

Lyria

> S:={D=1,alpha=rad(83.9),beta=rad(-19),phi=rad(45),mu=rad(1), Omega=rad(-2),smM=rad(-51)..rad(9),A=50,a=40,b=14,P=0,L=8,W[1]=rad(6),W[2]=rad(27),N=8};
R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):

S := {P = 0, D = 1, Omega = -1/90*Pi, smM = -17/60*...
S := {P = 0, D = 1, Omega = -1/90*Pi, smM = -17/60*...

> plot3d(R1,s=subs(S,smM),Theta=-4*Pi..4*Pi,grid=[80,150],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xyz,orientation=[-48,75]);

[Maple Plot]

Turritella

> S:={D=1,alpha=rad(88.9),beta=rad(4),phi=rad(55),mu=rad(1), Omega=rad(-2),smM=rad(-267)..rad(39),A=22.2,a=1.3,b=1.5,P=0,L=0};
R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):

S := {P = 0, D = 1, Omega = -1/90*Pi, mu = 1/180*Pi...

> plot3d(R1,s=subs(S,smM),Theta=-30*Pi..4*Pi,grid=[30,250],orientation=[-83,89],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy);

[Maple Plot]

Oxystele

> S:={D=1,alpha=rad(84.9),beta=rad(7),phi=rad(-36),mu=rad(1), Omega=rad(-2),smM=rad(-70)..rad(70),A=47,a=40,b=19,P=0,L=0,W[1]=6,W[2]=27,N=8};
R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):

S := {P = 0, D = 1, smM = -7/18*Pi .. 7/18*Pi, A = ...
S := {P = 0, D = 1, smM = -7/18*Pi .. 7/18*Pi, A = ...

> plot3d(R1,s=subs(S,smM),Theta=-20*Pi..4*Pi,grid=[40,150],style=patchnogrid,lightmodel=light2,shading=xy,scaling=constrained,orientation=[-68,94]);

[Maple Plot]

Nautilus

> S:={D=1,alpha=rad(80),beta=rad(90),phi=rad(0),mu=rad(0), Omega=rad(0),smM=rad(-163)..rad(163),A=2,a=2,b=1.5,P=0,L=0};
R:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])));

S := {P = 0, D = 1, A = 2, a = 2, b = 1.5, alpha = ...

R := [2.*cos(Theta)*(sqrt(-486111111.*cos(s)^2+1111...
R := [2.*cos(Theta)*(sqrt(-486111111.*cos(s)^2+1111...
R := [2.*cos(Theta)*(sqrt(-486111111.*cos(s)^2+1111...

> plot3d(R,s=subs(S,smM),Theta=Pi..4*Pi,grid=[30,60],scaling=constrained,orientation=[-79,54],style=patchnogrid,lightmodel=light2,shading=xy);

[Maple Plot]

Planorbis

> S:={D=1,alpha=rad(84),beta=rad(85),phi=rad(10),mu=rad(45), Omega=rad(5),smM=rad(-150)..rad(130),A=45,a=20,b=30,P=0,L=0,W[1]=6,W[2]=27,N=8};
R:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z]))):

S := {P = 0, D = 1, b = 30, W[1] = 6, W[2] = 27, N ...

> plot3d(R,s=subs(S,smM),Theta=-1*Pi..4*Pi,grid=[40,60],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-94,65]);

[Maple Plot]

Ammonite

> S:={D=1,alpha=rad(83),beta=rad(90),phi=rad(1),mu=rad(1), Omega=rad(1),smM=rad(-170)..rad(170),A=2.5,a=1,b=0.9,P=10,W[1]=100,W[2]=20,N=15,L=1/2};
R1:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z]))):

S := {W[2] = 20, W[1] = 100, P = 10, b = .9, a = 1,...
S := {W[2] = 20, W[1] = 100, P = 10, b = .9, a = 1,...

> plot3d(R1,s=subs(S,smM),Theta=-1*Pi..4*Pi,grid=[40,60],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-90,62]);

[Maple Plot]

Conus

> S:={D=1,alpha=rad(87),beta=rad(7),phi=rad(78),mu=rad(0), Omega=rad(0),smM=rad(-180)..rad(2),A=7,a=4.3,b=1,P=0,L=0,W[1]=6,W[2]=27,N=8};
R:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):

S := {a = 4.3, A = 7, D = 1, N = 8, W[2] = 27, W[1]...

> plot3d([R[3],R[1],R[2]],s=subs(S,smM),Theta=-12*Pi..4*Pi,grid=[60,80],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-76,137]);

[Maple Plot]

Helcion

> S:={D=1,alpha=rad(18),beta=rad(90),phi=rad(0),mu=rad(0), Omega=rad(-40),smM=rad(-180)..rad(180),A=450,a=400,b=310,P=0,L=0,W[1]=6,W[2]=27,N=8};
R:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])));

S := {b = 310, a = 400, A = 450, D = 1, N = 8, W[2]...

R := [50*(9*cos(Theta)*sqrt(-639*cos(s)^2+1600)+248...
R := [50*(9*cos(Theta)*sqrt(-639*cos(s)^2+1600)+248...

> plot3d(R,s=subs(S,smM),Theta=-0*Pi..4*Pi,grid=[40,60],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-94,65]);

[Maple Plot]

Codakia

> S:={D=1,alpha=rad(37),beta=rad(90),phi=rad(0),mu=rad(1), Omega=rad(1),smM=rad(-180)..rad(180),A=10500,a=10000,b=10500,P=0,L=0,W[1]=6,W[2]=27,N=8};
R2:=simplify(subs(S,subs(SR,SRE,Sk,Sg,[x,y,z]))):

S := {D = 1, A = 10500, a = 10000, b = 10500, alpha...
S := {D = 1, A = 10500, a = 10000, b = 10500, alpha...

> plot3d(R2,s=subs(S,smM),Theta=-1*Pi..4*Pi,grid=[40,100],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-79,-3]);

[Maple Plot]

Adding bumps

> S1:={D=1,alpha=rad(83),beta=rad(90),phi=rad(1),mu=rad(1), Omega=rad(1),smM=rad(-170)..rad(170),A=2.5,a=1,b=0.9};

S1 := {b = .9, a = 1, A = 2.5, D = 1, mu = 1/180*Pi...

> S2:={W[1]=rad(100),W[2]=rad(20),N=15,L=1/2,P=rad(10)};

S2 := {P = 1/18*Pi, L = 1/2, N = 15, W[2] = 1/9*Pi,...

> R1:=simplify(subs(S1,S2,subs(SR,SRE,Sk,Sg,[x,y,z]))):

> plot3d(R1,s=subs(S1,S2,smM),Theta=-Pi..3*Pi,grid=[150,150],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-90,15]);

[Maple Plot]

Struthiolaria

> S:={D=1,alpha=rad(86.9),beta=rad(13),phi=rad(40),mu=rad(10), Omega=rad(30),smM=rad(-168)..rad(24),A=5,a=1.8,b=1.6,P=rad(-15),L=1/2,W[1]=rad(5),W[2]=rad(5),N=16};
R1:=subs(S,subs(SR,SRE,Sk,Sg,[x,y,z])):

S := {D = 1, L = 1/2, N = 16, alpha = .4827777778*P...
S := {D = 1, L = 1/2, N = 16, alpha = .4827777778*P...

> plot3d(R1,s=subs(S,smM),Theta=-8*Pi..4*Pi,grid=[150,150],style=patchnogrid,scaling=constrained,lightmodel=light2,shading=xy,orientation=[-58,82]);

[Maple Plot]

References

A. Cortie : Digital Seashells Comput & Graphics Vol 17 , pp. 79-84 (1993)

Disclaimer: While every effort has been made to validate the solutions in this worksheet, Waterloo Maple Inc. and the contributors are not responsible for any errors contained and are not liable for any damages resulting from the use of this material.