Spidron2.mws

Spidron (2)
Az  Erdély Dániel által felfedezett geometriai akakzat mozgásának az elemzése és megjelenítése
Készítette: dr. Szilassi Lajos
                  SZTE JGYTF Matematika Tanszék
E-mail:      
szilassi@jgytf.u-szeged.hu

A feladat:

Az Erdély Dániel által  "spidron"-nak nevezett geometriai konstrukció mozgásának a leírását, elemzését és megjelenítését tűztük ki célul.

A spidron "fészek" egy szabályos hatszög alkalmas módon történő összhajtásával előálló felület. Egy ilyen s pidron-fészek  hat, egymással egybevágó spidron-kar -ból áll, ahol mindegyik kar alapalakzatok  egymáshoz kapcsolódó sorozata.

Egy alapalakzat egy 120°-os csúcsszögű egyenlőszárú háromszögből és egy ehhez illesztett szabályos háromszögből áll,

amelyek együtt - amennyiben egy síkban vannak - egy derékszögű háromszöget alkotnak.

Hat egybevágó alapalakzatból előállítható egy spidron-gyűrű.  Maga a spidron-fészek tekinthető úgy is, mint ilyen egymásba illesztett spidron-gyűrűk sorozata.

[Maple Plot] [Maple Plot]

[Maple Plot] [Maple Plot]

A   Spidron(1)  Maple fájlban kiszámítottuk azokat a függvényeket, amelyek meghatározzák egy  alapalakzat, így egy spidron-fészek mozgását.

Most a spidron-fészek rajzolásával, valamint az ezt leírő két függvény elemzésével foglalkozunk.

>   

>    restart;with(plots):with(plottools):
unprotect(D):

Warning, the name changecoords has been redefined

Warning, the name arrow has been redefined

>   

Átalánosan használható eljárások

Szín-skálák

>    sz:= t-> COLOR(HSV,t,0.5,1):

Ez egy folytonos szín skála, bemenő adata egy 0 és 1 kötötti szám

>    sf:=n -> [seq(COLOR(HSV,(i-1)/n,0.5,1),i=1..n)]:

Ez  színeknek egy  n  hosszú listában tárolt n  tagú sorozata.
 Arra fogjuk használni, hogy színekkel (is) érzékeltessük, hogy a megjelenített sorozat tagjai hogyan követik egymást.

>    #t:= P -> P[1]^2+P[2]^2+P[3]^2:

A P v ektor hosszának a négyzetét számítja ki.

# #e := transform((x,y,z) -> [x,y,-z]):

Egy már megrajzolt objektum tükrözése az (x,y)  síkra

>   

A spidron előállításához szükséges eljárások

>    V:= proc(d,alpha,beta)
    local F,A,c,V;
     c:=d*cos(beta)*sqrt(3)/2:
     F:=[c*cos(alpha),c*sin(alpha),0]:
     A:=[-d*sin(alpha)*cos(beta)/2,d*cos(alpha)*cos(beta)/2,d*sin(beta)/2]:
     V:=[F+A,F-A]:
  end proc:
a:=f-> arccos(1/4*(3^(1/2)-2*3^(1/2)*cos(f)+3*3^(1/2)*cos(f)^2
       -(-1+4*cos(f)-3*cos(f)^2)^(1/2)*sin(f))/(2-4*cos(f)+3*cos(f)^2)^(1/2)/cos(f)):
b:= f-> arctan((-1-3*cos(f)^2+4*cos(f))^(1/2)/(2+3*cos(f)^2-4*cos(f))^(1/2)):

A V  eljárás annak a szakasznak a  két végpontját állítja elő, amely a spidron "fészek " térbeli szabályos hatszögének az oldala,
vagyis az alapalakzatot alkotó 120°-os egyenlőszárú háromszög alapja.
Bemenő adatok:
d : a térbeli szabályos hatszög oldala
 
alpha   az a szög, amelyet az OF egyenes az x tengellyel bezár, ahol O  az origó,  F  az AB  oldal felezőpontja - az (xy)  síkban..
 
beta  az a szög, amelyet a következő hatszög oldala-vagyis AB  felezőpontja az (xy) síkkal bezár

Belső változók:
c:  A hatszögoldal felezőpontjának az origótól mért távolsága. (Ez függ   beta  -tól, nagyobb   beta  esetén a felezőpont közelebb kerül az origóhoz)
    Kihasználtuk, hogy a hatszögoldal merőleges vetülete is szabályos hatszög.

F:  A hatszög oldalfelező pontja;
A :  a  -térbeli - hatszögoldal egyik csúcsa.
Az
a(f) és  b(f)  függvényben   f  a spidron-alapalakzat   AB   oldalának az XY  síkkal bezárt szögét jelenti;
a(f)   a FOG szög, ahol O  az origó,  F  az AB  oldal, G  a CD  oldal felezőpontja - az (xy)  síkban..
 
b(f) a CD  szakasznak az XY  síkkal bezárt szöge.
Lényegében ezek a függvények adják meg, hogy a spidron-alapalakzat sorozat következő tagja
 hogyan helyezkedik el az előző (
f  -el jellemzett) taghoz képest.
Ezeket egy előző programmal határoztuk meg .

>   

A megjelenítés eljárásai

Egy (térbeli ) alapalakzat megjelenítése

>    P0:=proc(f)
local d, A,B,C,D,L,H1,H2,T:
d:=10:
if is(f<0) or is(f >= Pi/2) then
printf("Nincs értelme a feladatnak: f =%d°",fok(f)):else
A:=V(d,0,f)[1]:
B:=V(d,0,f)[2]:
C:=V(d/sqrt(3),a(f),b(f))[1]:
D:=V(d/sqrt(3),a(f),b(f))[2]:
H1:=polygonplot3d([A,B,D],color=green):
H2:=polygonplot3d([A,C,D],color=yellow):
T:=textplot3d([ [A[1],A[2],A[3],"A"],
                [B[1],B[2],B[3],"B"],
                [C[1],C[2],C[3],"C"],
                [D[1],D[2],D[3],"D"],
                [  0,   0,    0,"O"]]
               ,font=[TIMES,BOLD,14]
               ,color=black):
display3d(H1,H2
         ,T
        ,axes= normal,scaling= constrained);
end if:
end proc:

Az eljárás bemenő adata az a szög -ívmértékben- , amekkora szöget az AB oldal az XY  síkkal bezár.
A spidron-kar szélső helyzete, az, amelyben f=Pi/3 . Ekkor AD  merőleges lesz az XY síkra.
Igy az e feletti
f értéknek geometiailag nincs értelme.

>    P0(Pi/4);

[Maple Plot]

>    P0(Pi/3); # Ez a maximális értelmezhető bemenő adat.

[Maple Plot]

>    P0(Pi/3+0.15); # Ebből már nem lehet valódi spidront készíteni

[Maple Plot]

>    P0(arcsin(sqrt(3)/3));
fok(arcsin(sqrt(3)/3));

[Maple Plot]

fok(arcsin(1/3*3^(1/2)))

Ez az az eset, amelyben a spidron-fészek széle éppen egy kocka éleit alkotja.

>    n:=15: d:=Pi/3/n:
display3d(seq(P0(i*d),i=0..n),seq(P0((n-i)*d),i=0..n),insequence=true);

[Maple Plot]

>   

A fenti "mozi"-ban n  a fázisok számát jelenti.   n -et növelve lassúbb és folyanmatosabb lesz a mozgás.

>   

A fenti kép előállításához javasoljuk a betűzés kiiktatását a  P0 eljárásból a mely a T rész-eljárás.

>    P1:=proc(f)
local d, A,B,C,D,L,H1,H2,T:
d:=10:
if is(f<0) or is(f >= Pi/2) then
printf("Nincs értelme a feladatnak: f =%d°",fok(f)):else
A:=V(d,0,f)[1]:
B:=V(d,0,f)[2]:
C:=V(d/sqrt(3),a(f),b(f))[1]:
D:=V(d/sqrt(3),a(f),b(f))[2]:
H1:=polygonplot3d([A,B,D],color=green):
H2:=polygonplot3d([A,C,D],color=yellow):
display3d(H1,H2
         ,axes= normal,scaling= constrained);
end if:
end proc:

Ez az eljárás ugyanaz, mint az elöbbi, csak nem írtuk ki a csúcsok nevét.
 Ezzel célszerű olyan sorozatot megjeleníteni, ahol minden fázis egyszerre látszik.

>    n:=20: d:=Pi/3/n:
display3d(seq(P1(i*d),i=0..n),insequence=false);

[Maple Plot]

Ezt célszerű nagyobb n  értékkel kipróbálni, így megfigyelhető, hogy a csúcsok milyen mozgást írnak le.

>   

>   

Egy spidron kar megjelenítése

>    SP:=proc(f)
local n,d,i,A,B,C,D,L,L1,L2,H1,H2,nd,na,nb,szin, R:
n:=8:szin:=sf(n):
nd:=10:na:=0: nb:=evalf(f):
szin:=sf(n):
A:=V(nd,na,nb)[1]:
B:=V(nd,na,nb)[2]:
L:=line(A,B,color=blue,linestyle=32):
for i from 1 to n do
A:=V(nd,na,nb)[1]:
B:=V(nd,na,nb)[2]:
nd:=nd/sqrt(3):na:=na+a(nb): nb:=b(nb):
C:=V(nd,na,nb)[1]:
D:=V(nd,na,nb)[2]:
L1:=line(D,B, color=magenta, linestyle=32):
L2:=line(A,C, color=red, linestyle=32):
H1:=polygonplot3d([A,B,D]):
H2:=polygonplot3d([A,C,D]):
R[i]:=
display3d(L,L1,L2,H1,H2,scaling= constrained,color=szin[i]);
end do:
display3d(seq(R[i],i=1..n),insequence=false);
end proc:

Az eljárás bemenő adata ugyancsak az a szög -ívmértékben- , amekkora szöget a legelső alapalakzat az XY  síkkal bezár.
Itt - és a továbbiakban is
 n=8  alapalakzatát vettük a spidron-karnak, a továbbiak úgy sem látszanak.

A spidron-kar szélső helyzete, az, amelyben f=Pi/3 . Ekkor AD  merőleges lesz az XY síkra.
Igy az e feletti
f értéknek geometiailag nincs értelme. Itt nem teszteltük le  f -et.
Célszerű az alábbi rajzokon be- ill kikapcsolt koordinátarendszerrel is megnézni a jelenséget.
Az eljárás legfontosabb sora ez:  
                        
nd:=nd/sqrt(3): na:=na+a(nb): nb:=b(nb):

  amelyben (szimultán, azaz egymásra hivatkozó)  rekurzív képletekkel határozzuk meg a következő alpalakzathoz a bemenő adatokat.

>    SP(Pi/4);

[Maple Plot]

>    SP(Pi/3);

[Maple Plot]

>    SP(0);

[Maple Plot]

>    SP(arcsin(sqrt(3)/3));

[Maple Plot]

Ez az az eset, amelyben a spidron-fészek széle éppen egy kocka éleit alkotja.

>    SP(-Pi/4);

[Maple Plot]

>    SP(Pi/3+0.1);

[Maple Plot]

>    SP(Pi/2);

Error, (in polygonplot3d) incorrect first argument

Itt már kihagytuk a z ellenőrző részt az eljárásból. Figyeljük meg, hogy rosszul választott adatokkal rosszul, ill, sehogy nem működik az eljárás.

>    n:=20: d:=Pi/3/n:
display3d(seq(SP(i*d),i=0..n),seq(SP((n-i)*d),i=0..n)
,axes=normal
,insequence=true);

[Maple Plot]

A fenti "mozi"-ban n  a fázisok számát jelenti.   n -et növelve lassúbb és folyanmatosabb lesz a mozgás.

>    n:=10: d:=Pi/3/n:
display3d(seq(SP(i*d),i=0..n),insequence=false);

[Maple Plot]

>   

Egy spidron-fészek megjelenítése

>    SPF:=proc(f)
local n,i,A,B,C,D,L,szin,H1,H2,nd,na,nb, R,t,e,fel,le,E,V1,V2,V3,SPF:
t := transform((x,y,z) ->[x,y,-z]):
e := transform((x,y,z) ->[x,y,signum(f)*z]):
nd:=1: n:=8: na:=0: nb:=abs(evalf(f)):
# nd  a külső spidrongyű élhossza,     n  a spidronfészek mélysége
#  Ezek állitható paraméterek, a rekurzió kezdő adatai
# nb-t úgy értelmeztük, hogy negatív bemenő paraméter értékkel is működjön az eljárás
# Ehhez kellett az
e  belső eljárás, mely megfordítja a a már elkészített spidronfészket, ha f<0  volt.
szin:=sf(n):
E:=line(V(nd,na,nb)[1],V(nd,na,nb)[2], color=blue
       , linestyle=16
       ):
for i from 1 to n do
A:=V(nd,na,nb)[1]:
B:=V(nd,na,nb)[2]:
nd:=nd/sqrt(3):na:=na+a(nb): nb:=b(nb):
C:=V(nd,na,nb)[1]:
D:=V(nd,na,nb)[2]:
L:=line(D,B, color=red
       # , linestyle=16
    ):
H1:=polygonplot3d([A,B,D]):
H2:=polygonplot3d([A,C,D]):
R[i]:=
  display3d(H1,H2
         ,L
# kiiktatható. Ez a spidronkar külső éle
        #,color=szin[i] #
Ha ezt bekapcsoljuk, akkor változnak a színek a spirál-karon belül
  );
end do:
fel:=display3d(seq(R[i],i=1..n)
           ,E # kiiktatható, ez a spidronfészek széle
           ,insequence=false):
le:=rotate(t(fel),0,0,Pi/3):
V1:=display3d(fel,le):
V2:=rotate(V1,0,0,2*Pi/3):
V3:=rotate(V2,0,0,2*Pi/3):
SPF:=e(display3d(V1,V2,V3
  ,lightmodel=light4
  ,style=patchnogrid
  ,scaling= constrained
# ,color=cyan
#,color=sz(evalf(f))
# Ha ezt bekapcsoljuk, akkor a spidron színe az összehúzódástól függően változik
));
end proc:

A fenti eljárásban - Pi/3<f<Pi/3   esetben kapunk helyes, modellezhető alakzatról készült  rajzot.

>    SPF(Pi/8);
SPF(-Pi/8);

[Maple Plot]

[Maple Plot]

A fenti két rajzból látszik, hogy a térben elhelyezett spidron-fészek esetén nincs értelme "jobbra" ill. "balra" csavarodó spidron-fészekről beszélni, mert mindez attól füg, honnan nézzük. Ez két, vagy több egymáshoz illesztett spidronfészek egymáshoz viszonyított helyzeténén válik vizsgálható kérdéssé.

>    SPF(Pi/3);

[Maple Plot]

>    SPF(0);

[Maple Plot]

>    SPF(arcsin(sqrt(3)/3));

[Maple Plot]

Ez az az eset, amelyben a spidron-fészek széle éppen egy kocka éleit alkotja.

>    n:=15: d:=Pi/3/n:
display3d(seq(SPF(i*d),i=-n..n),seq(SPF(-i*d),i=-n..n)
,lightmodel=light4
,insequence=true);

[Maple Plot]

A fenti "mozi"-ban n  a fázisok számát jelenti.   n -et növelve lassúbb és folyanmatosabb lesz a mozgás,de jóval hosszabb ideig tart az animáció felépítése.

>   

>   

Hét szomszédos spidron-fészek megjelenítése

>    SOKSP:= proc(beta)
local  c :
 c:=cos(beta)*sqrt(3)/2:

display3d(
           SPF(beta)
,translate(SPF(beta), 2*c,         0,0)
,translate(SPF(beta),   c,-c*sqrt(3),0)
,translate(SPF(beta),  -c,-c*sqrt(3),0)
,translate(SPF(beta),-2*c,         0,0)
,translate(SPF(beta),  -c, c*sqrt(3),0)
,translate(SPF(beta),   c, c*sqrt(3),0)
  ,scaling= constrained
  ,lightmodel=light4
  ,style=patchnogrid
#,color=cyan
#,color=sz(evalf(beta))
);
end proc:

>   

Itt az SPF egy külső eljárás, elötte aktivizálni kell
Ideiglenesen kiiktathatjuk  a piros spirálvonalnak ( L ) valamint a fészek -kék - szélének  ( E )  a vasagságát. .Magukat a vonalakat is i lehet iktatni  
n:=4 -recélszerű levennünk  levettük a spidron kar mélységét, így is sokáig tart egy mozgó kép elkészítése.

>    SOKSP(Pi/8);

[Maple Plot]

>    SOKSP(-Pi/8);

[Maple Plot]

>    SOKSP(0);

[Maple Plot]

>    SOKSP(arcsin(sqrt(3)/3));

[Maple Plot]

Ez az az eset, amelyben a spidron-fészek széle éppen egy kocka éleit alkotja.

>    nf:=5: d:=Pi/3/nf:
display3d(seq(SOKSP(i*d),i=-nf..nf),seq(SOKSP(-i*d),i=-nf..nf)
,lightmodel=light4
,insequence=true,scaling=constrained);

[Maple Plot]

A fenti "mozi"-ban nf  a fázisok számát jelenti.   nf -et növelve lassúbb és folyanmatosabb lesz a mozgás,
Ugyanakkor lényegesen tovább tart a kép kiszámítása.  2*nf kép készül

>   

>   

>   

A spidron-fészek közepének a (numerikus) vizsgálata

Azt fogjuk elemezni, hogy a kezdő alapalakzat legnagyobb élét, azaz a (térbeli) hatszögvonal egy élét a lehető legmeredekebbre (azaz 60°-ra) ,vagy egy előre adott értékre állítva, a további si hatszög élek mekkora szöggel fordulnak el az elsőhöz, ill. az előzőhöz  képest  ( a étrék) és mekkora szöggel fordulnak el az (x,y)  síkhoz képest ( b érték).
A fészek közepe felé tartva a szomszédos alapalakzatok elfordulásainak a különbsége, vagyis
  a   (felülről) közelít a 30°-hoz, b  a 0 fokoz,
Tapasztalni fogjuk, hogy ez a közeledés igen lassú.

>    a(alpha);
b(beta);

arccos(1/4*(3^(1/2)-2*3^(1/2)*cos(alpha)+3*3^(1/2)*cos(alpha)^2-(-1+4*cos(alpha)-3*cos(alpha)^2)^(1/2)*sin(alpha))/(2-4*cos(alpha)+3*cos(alpha)^2)^(1/2)/cos(alpha))

arctan((-1+4*cos(beta)-3*cos(beta)^2)^(1/2)/(2-4*cos(beta)+3*cos(beta)^2)^(1/2))

>    k1:=textplot([Pi/3-0.1,a(Pi/3)-0.1,"a(f)"],color=red,font=[TIMES,BOLD,14]):
k2:=textplot([Pi/3-0.1,b(Pi/3)+0.12,"b(f)"],color=blue,font=[TIMES,BOLD,14]):
fgv:=plot([a(x),b(x),Pi/6,Pi/3],x=0..Pi/3,color=[red,blue,black,black],linestyle=16):
display(fgv,k1,k2,axes=normal,scaling=constrained) ;

[Maple Plot]

Az alábbiakban megvizsgáljuk, hogy n  egymásba épített spidrongyűrű rendre mekkora szöggel fordul el a legkülsőhöz képest ( an ) asz élei mekkora szöget zárnak be a spidron-fészek síkjával ( bn) és melkkora a spidron-gyűrű külső éleinek a gossza ( dn)

>    fok:= x->round(x*180/Pi):

Ez az eljárás ívmértékben megadott szöget számít át fokokba.

>    n:=30;f0:=arcsin(sqrt(3)/3): # Ez a kocka esete
#f0:=Pi/3;  
#Ez a szélső helyzet
#f0:=Pi/18;
f0:=0.85:# Ez már 10°-ról indul
f:=f0:an:=0:bn:=f:
m:= fok(an) mod 360:
k:=trunc(fok(an)/360):
d:=10:
for i from 0 to n do
d:=d/sqrt(3):
printf(" %3d.  an =%3d fordulat + %4d fok ,  bn = % 3d fok   dn= %g
",i,k,m,fok(bn),d);
F[i]:=line([bn,0],[bn,b(bn)],linestyle=16,color=magenta):
an:=an+a(f):bn:=b(f):    f:=evalf(bn,3):
m:= fok(an) mod 360:
k:=trunc(fok(an)/360):
end  do:
 

n := 30

   0.  an =  0 fordulat +    0 fok ,  bn =  49 fok   dn= 5.773503 

   1.  an =  0 fordulat +   54 fok ,  bn =  35 fok   dn= 3.333333 

   2.  an =  0 fordulat +   96 fok ,  bn =  31 fok   dn= 1.924501 

   3.  an =  0 fordulat +  135 fok ,  bn =  28 fok   dn= 1.111111 

   4.  an =  0 fordulat +  173 fok ,  bn =  26 fok   dn= .6415   

   5.  an =  0 fordulat +  210 fok ,  bn =  25 fok   dn= .37037  

   6.  an =  0 fordulat +  245 fok ,  bn =  23 fok   dn= .213833 

   7.  an =  0 fordulat +  280 fok ,  bn =  22 fok   dn= .123457 

   8.  an =  0 fordulat +  315 fok ,  bn =  21 fok   dn= .071278 

   9.  an =  0 fordulat +  349 fok ,  bn =  21 fok   dn= .041152 

  10.  an =  1 fordulat +   23 fok ,  bn =  20 fok   dn= .023759 

  11.  an =  1 fordulat +   57 fok ,  bn =  19 fok   dn= .013717 

  12.  an =  1 fordulat +   90 fok ,  bn =  19 fok   dn= .007920 

  13.  an =  1 fordulat +  123 fok ,  bn =  18 fok   dn= .004572 

  14.  an =  1 fordulat +  156 fok ,  bn =  18 fok   dn= .002640 

  15.  an =  1 fordulat +  189 fok ,  bn =  17 fok   dn= .001524 

  16.  an =  1 fordulat +  222 fok ,  bn =  17 fok   dn= .000880 

  17.  an =  1 fordulat +  254 fok ,  bn =  16 fok   dn= .000508 

  18.  an =  1 fordulat +  287 fok ,  bn =  16 fok   dn= .000293 

  19.  an =  1 fordulat +  319 fok ,  bn =  16 fok   dn= .000169 

  20.  an =  1 fordulat +  351 fok ,  bn =  15 fok   dn= 9.777478e-05 

  21.  an =  2 fordulat +   24 fok ,  bn =  15 fok   dn= 5.645029e-05 

  22.  an =  2 fordulat +   56 fok ,  bn =  15 fok   dn= 3.259159e-05 

  23.  an =  2 fordulat +   88 fok ,  bn =  15 fok   dn= 1.881676e-05 

  24.  an =  2 fordulat +  119 fok ,  bn =  14 fok   dn= 1.086386e-05 

  25.  an =  2 fordulat +  151 fok ,  bn =  14 fok   dn= 6.272255e-06 

  26.  an =  2 fordulat +  183 fok ,  bn =  14 fok   dn= 3.621288e-06 

  27.  an =  2 fordulat +  215 fok ,  bn =  14 fok   dn= 2.090752e-06 

  28.  an =  2 fordulat +  247 fok ,  bn =  13 fok   dn= 1.207096e-06 

  29.  an =  2 fordulat +  278 fok ,  bn =  13 fok   dn= 6.969172e-07 

  30.  an =  2 fordulat +  310 fok ,  bn =  13 fok   dn= 4.023653e-07 

>   

Láthatóan lassan közeledik a bn rekurzív sorozat a 0-hoz. Ezt az alábbi rajz is szemlélteti.

>    unassign('x');
display(plot([x,b(x)],x=0..Pi/3,linestyle=16,color=[red,blue],linestyle=16)
,display3d(seq(F[i],i=1..n))
,scaling=constrained);

[Maple Plot]

Megvizsgáljuk(igen nagy pontossággal) , hogy egy 170 tagú sorozatnál  hogyan alakulnak a fenti értékek

>    Digits:=100;

Digits := 100

>    c1:=evalf(sqrt(3)/3):c2:=evalf(180/Pi):
n:=169;
d:=1e23:x:=evalf(arcsin(sqrt(3)/3)):# Ez a kocka esete
bn:=evalf(Pi/3);
i:=0:xf:=x*c2;
print(i,`.   fn = `,bn*c2,`   d =  `,d);
for i from 0 to n do
         d:=evalf(d/sqrt(3)):
         bn:=b(bn):    
   #print(i,`.   fn = `,bn*c2,`   d =  `,d);
 end  do:

print(i,`.   fn = `,bn*c2,`   d =  `,d);

>   

n := 169

bn := 1.047197551196597746154214461093167628065723133125035273658314864102605468762069666209344941780705689

xf := 35.26438968275465431537700033001878201849657844954602585591444682198012678096980221831906435581970618

0, `.   fn = `, 59.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998, `   d =  `, .1e24
0, `.   fn = `, 59.99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999998, `   d =  `, .1e24

170, `.   fn = `, 5.993471515396080033721206315048232919197885754543619887426467988172944659299689926962472970428500983, `   d =  `, .2784154609541307270170357727625724948755590742170940842021598102945...
170, `.   fn = `, 5.993471515396080033721206315048232919197885754543619887426467988172944659299689926962472970428500983, `   d =  `, .2784154609541307270170357727625724948755590742170940842021598102945...

Látható, hogy 170 lépés után is még közel 6°-nyi a spidrongyűrűélének az   spidronfészek síkjával bezárt szöge, miközben a az élhossza az edig ismert  világegyetem méretérőla kvrk méretéig csökkent.

>   

>   

Egy spidron-fészek csúcsainak a koordinátái

>    n:=4:  # itt lehet megadni, hogy hány hatszög álljon elő   1< =n <=8  a javasolt.

>    SPA:=proc(f)
local i,A,B,nd,na,nb,P,SPA:
P:=array(1..6,1..n):
nd:=10: na:=0: nb:=evalf(f):
for i from 1 to n do
  A:=evalf(V(nd,na,nb)[1],2):
  B:=evalf(V(nd,na,nb)[2],2):
  P[1,i]:=B:
  P[2,i]:=A:
  P[4,i]:=-B:
  P[5,i]:=-A:
  P[3,i]:=[P[2,i][1]+P[4,i][1],P[2,i][2]+P[4,i][2],P[1,i][3]]:
  P[6,i]:=[P[5,i][1]+P[1,i][1],P[5,i][2]+P[1,i][2],P[2,i][3]]:
  nd:=nd/sqrt(3):na:=na+a(nb): nb:=b(nb):
end do:
SPA:=P:
end proc:

L0:=[[2,3,4,5]
   ,[2,5,6,7]
   ,[2,7,8,3]
  ]:
L1:= i ->[
    [3+6*i,4+6*i,9+6*i]
   ,[4+6*i,9+6*i,10+6*i]
   ,[4+6*i,10+6*i,5+6*i]  
   ,[5+6*i,10+6*i,11+6*i]
   ,[5+6*i,6+6*i,11+6*i]
   ,[6+6*i,11+6*i,12+6*i]
   ,[6+6*i,7+6*i,12+6*i]
   ,[7+6*i,12+6*i,13+6*i]
   ,[7+6*i,8+6*i,13+6*i]
   ,[8+6*i,13+6*i,14+6*i]
   ,[8+6*i,3+6*i,14+6*i]
   ,[3+6*i,14+6*i,9+6*i]
]:

L2:=[[1,6*n-3,6*n-2]
   ,[1,6*n-2,6*n-1]
   ,[1,6*n-1,6*n  ]
   ,[1,6*n  ,6*n+1]
   ,[1,6*n+1,6*n+2]
   ,[1,6*n+2,6*n-3]
]:
L:=[  
#Ez a lapok listája.
       op(L0)
 #  Ez a belseje, ami az origóból kiinduló háromszögekkel "tömi ki" a belső lyukat. Kiiktatható
     ,seq(op(L1(i)),i=0..n-2)
# Ez maga a spidron fészek
     ,op(L2)  
#Ez a kocka (vagy romboéder) három lapja. kiiktatható.( A #  jellel)
  ]:

>    L;

[[2, 3, 4, 5], [2, 5, 6, 7], [2, 7, 8, 3], [3, 4, 9], [4, 9, 10], [4, 10, 5], [5, 10, 11], [5, 6, 11], [6, 11, 12], [6, 7, 12], [7, 12, 13], [7, 8, 13], [8, 13, 14], [8, 3, 14], [3, 14, 9], [9, 10, 15]...
[[2, 3, 4, 5], [2, 5, 6, 7], [2, 7, 8, 3], [3, 4, 9], [4, 9, 10], [4, 10, 5], [5, 10, 11], [5, 6, 11], [6, 11, 12], [6, 7, 12], [7, 12, 13], [7, 8, 13], [8, 13, 14], [8, 3, 14], [3, 14, 9], [9, 10, 15]...
[[2, 3, 4, 5], [2, 5, 6, 7], [2, 7, 8, 3], [3, 4, 9], [4, 9, 10], [4, 10, 5], [5, 10, 11], [5, 6, 11], [6, 11, 12], [6, 7, 12], [7, 12, 13], [7, 8, 13], [8, 13, 14], [8, 3, 14], [3, 14, 9], [9, 10, 15]...
[[2, 3, 4, 5], [2, 5, 6, 7], [2, 7, 8, 3], [3, 4, 9], [4, 9, 10], [4, 10, 5], [5, 10, 11], [5, 6, 11], [6, 11, 12], [6, 7, 12], [7, 12, 13], [7, 8, 13], [8, 13, 14], [8, 3, 14], [3, 14, 9], [9, 10, 15]...

>    M:=SPA(arcsin(sqrt(3)/3)): # Ez a kocka esete
#M:=SPA(0.3989112):
#M:=SPA(Pi/12):  
# Ez egy "laposabb" eset. ha a kockánál nagyobb szöget választunk, belemetsz saját magába.

>   

>    C:=[[0,0,0],[0,0,3*M[1,1][3]],seq((seq(M[i,j],i=1..6),j=1..n))]:
# Ez állítja elő a C (csúcsok) listáját

# Az L és C lista tartalmazza azokat az adatokat, amelyek átvihetők más programba Ki is irathatók:

>    L;

[[2, 3, 4, 5], [2, 5, 6, 7], [2, 7, 8, 3], [3, 4, 9], [4, 9, 10], [4, 10, 5], [5, 10, 11], [5, 6, 11], [6, 11, 12], [6, 7, 12], [7, 12, 13], [7, 8, 13], [8, 13, 14], [8, 3, 14], [3, 14, 9], [9, 10, 15]...
[[2, 3, 4, 5], [2, 5, 6, 7], [2, 7, 8, 3], [3, 4, 9], [4, 9, 10], [4, 10, 5], [5, 10, 11], [5, 6, 11], [6, 11, 12], [6, 7, 12], [7, 12, 13], [7, 8, 13], [8, 13, 14], [8, 3, 14], [3, 14, 9], [9, 10, 15]...
[[2, 3, 4, 5], [2, 5, 6, 7], [2, 7, 8, 3], [3, 4, 9], [4, 9, 10], [4, 10, 5], [5, 10, 11], [5, 6, 11], [6, 11, 12], [6, 7, 12], [7, 12, 13], [7, 8, 13], [8, 13, 14], [8, 3, 14], [3, 14, 9], [9, 10, 15]...
[[2, 3, 4, 5], [2, 5, 6, 7], [2, 7, 8, 3], [3, 4, 9], [4, 9, 10], [4, 10, 5], [5, 10, 11], [5, 6, 11], [6, 11, 12], [6, 7, 12], [7, 12, 13], [7, 8, 13], [8, 13, 14], [8, 3, 14], [3, 14, 9], [9, 10, 15]...

>    nops(C);

26

>    C[2];

[0, 0, -8.7]

Rajz az L és C listák felhasználásával.

>    NC:=nops(C):
NR:=textplot3d({seq([seq(C[i][k],k=1..3),i],i= 1..NC)}
,color=BLUE #A sorszám színe
,font=[TIMES,BOLD,14] # betűtípus, betűstílus, metűméret. (Most ki van kapcsolva)
):
NL:=nops(L);
# lapok száma
LC:=[seq([seq(C[L[i,j]],j=1..nops(L[i]))],i=1..NL)]:
LAP:=display3d(polygonplot3d(LC)):

NL := 45

>    LAP;

[Maple Plot]

>    polygonplot3d(LC);

[Maple Plot]

>   

>    display3d(LAP,scaling=constrained);

[Maple Plot]

>    display3d(LAP,scaling=constrained, lightmodel=light4);

[Maple Plot]

>   

Lapszögek meghatározása

>   
hossz:= a -> sqrt(a[1]^2+a[2]^2+a[3]^2):


skalarszorzat:= (a,b) ->a[1]*b[1]+a[2]*b[2]+a[3]*b[3]:


szog:= (a,b) -> if hossz(a)*hossz(b)<>0 then arccos(skalarszorzat(a,b)/hossz(a)/hossz(b)) else 0 fi:

fok:= x -> round(evalf(x*180/Pi)) mod 360:


vektoriszorzat:= (a,b) -> [a[2]*b[3]-a[3]*b[2],
                           a[3]*b[1]-a[1]*b[3],
                           a[1]*b[2]-a[2]*b[1]]:


vegyesszorzat:= (a,b,c) -> a[1]*b[2]*c[3]
                          +a[2]*b[3]*c[1]
                          +a[3]*b[1]*c[2]
                          -a[3]*b[2]*c[1]
                          -a[2]*b[1]*c[3]
                          -a[1]*b[3]*c[2]:


lapszog:= (a,b,c,d) -> sign(vegyesszorzat(b-a,c-a,d-a))*
           szog(vektoriszorzat(c-a,b-a),vektoriszorzat(d-a,b-a)):

>    fok(lapszog(C[3],C[4],C[2],C[9]));

1

>    C[3];C[4];C[2];C[9];

[6.8, -4.0, -2.9]

[6.8, 4.0, 2.9]

[0, 0, -8.7]

[4.9, 1.3, -1.4]

>    y:=x->-(arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))/(2.+3.*cos(x)^2-4.*cos(x))^(1/2)/cos(x)+1.2*(16.-1.*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))^2/(2.+3.*cos(x)^2-4.*cos(x))/cos(x)^2)^(1/2)/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2))*sin(x)-10.*(5.*sin(x)-2.9*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)/(2.+3.*cos(x)^2-4.*cos(x))^(1/2)/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2))*cos(x))-850.0*cos(x)*sin(x)^2*(-8.5*cos(x)+.71*(16.-1.*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))^2/(2.+3.*cos(x)^2-4.*cos(x))/cos(x)^2)^(1/2)/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)+1.2/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))/(2.+3.*cos(x)^2-4.*cos(x))^(1/2)/cos(x))-850.0*cos(x)^3*(-8.5*cos(x)+.71*(16.-1.*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))^2/(2.+3.*cos(x)^2-4.*cos(x))/cos(x)^2)^(1/2)/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)+1.2/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))/(2.+3.*cos(x)^2-4.*cos(x))^(1/2)/cos(x)))/(29725.00*sin(x)^2*cos(x)^2+7225.00*cos(x)^4)^(1/2)/((10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))/(2.+3.*cos(x)^2-4.*cos(x))^(1/2)/cos(x)+1.2*(16.-1.*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))^2/(2.+3.*cos(x)^2-4.*cos(x))/cos(x)^2)^(1/2)/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2))*sin(x)-10.*(5.*sin(x)-2.9*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)/(2.+3.*cos(x)^2-4.*cos(x))^(1/2)/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2))*cos(x))^2+100.*(-8.5*cos(x)+.71*(16.-1.*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))^2/(2.+3.*cos(x)^2-4.*cos(x))/cos(x)^2)^(1/2)/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)+1.2/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))/(2.+3.*cos(x)^2-4.*cos(x))^(1/2)/cos(x))^2*sin(x)^2+100.*(-8.5*cos(x)+.71*(16.-1.*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))^2/(2.+3.*cos(x)^2-4.*cos(x))/cos(x)^2)^(1/2)/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)+1.2/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2+4.*cos(x))^(1/2)*sin(x))/(2.+3.*cos(x)^2-4.*cos(x))^(1/2)/cos(x))^2*cos(x)^2)^(1/2)));

y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...
y := proc (x) options operator, arrow; -arccos((150.*cos(x)*sin(x)*(10.*(5.*cos(x)-.71/(1.+(-1.-3.*cos(x)^2+4.*cos(x))/(2.+3.*cos(x)^2-4.*cos(x)))^(1/2)*(1.7+5.1*cos(x)^2-3.4*cos(x)-1.*(-1.-3.*cos(x)^2...

>    y(0.4);

-.1808566258179169415280875491836027215083143421290590738304716324324723432752200429493043743054069641

>    y(0.42);

-.1802199842331939037166318628912142347766584758262763964603905523417672460663513190291386236650827453

>    y(0.3989111);

-.1808604897703016506565645952482373810394895727347546310632151364385756639616180434666812240751477597

>    y(0.3989112);

-.1808604895612350115521224455617397934963941678081951737296909027017130628727741147824998272910720250

>    evalf(0.3989112*180/Pi);

22.85592816049908431974860409468047042350426590820413338636137187096506119935352854647018587129776169

>    dy:=diff(y(x),x):

Error, wrong number (or type) of parameters in function diff

>    fsolve(dy=0);

0.

>    ?solve

>    plot(y,0..Pi/4);

[Maple Plot]

>    fok(evalf(s(Pi/12)));

round(57.29577951308232087679815481410517033240547246656432154916024386120284714832155263244096899585111094*s(1/12*Pi))

>   

>