/*Surface de Clebsch ; Equation de hunt 81*(x^3+y^3+z^3)-189*(x^2*y+x^2*z+y^2*x+y^2*z+z^2*x+z^2*y)+54*x*y*z+ 126*(x*y+x*z+y*z)-9*(x^2+y^2+z^2)-9*(x+y+z)+1 =0 */ #declare a=1 ; #include "colors.inc" #declare a=4 ; camera { orthographic location <-2.5,0.6,-3>*0.75 look_at<0,0.2,0> } light_source { <-4,5,-10> color White} light_source { <-5,10,-20> color White shadowless} light_source { <3,10,-10> color rgb <0.8,0.8,1>*0.5 shadowless} box {<-20,-1.3,-20>,<5,20,5> pigment {SkyBlue} // Yellow rotate <0,5, 0> } union{ // axes ---------------------- union{ #declare g=1.2 ; #declare r1=0.01; #declare k=4;// longueur fleche=k*r1 #declare co=1.8;// rayon base=co*r1 cylinder{ <-g/2,0,0>,,r1 } cone{ ,co*r1,,0 } cylinder{ <0,-g/2,0>,<0,g,0>,r1 } cone{ <0,g,0>,co*r1,<0,g+k*r1,0>,0 } cylinder{<0,0,-g/2>,<0,0,g>,r1 } cone{ <0,0,g>,co*r1,<0,0,g+k*r1>,0 } pigment { Yellow transmit 0.3} } union{ #declare r=0.006 ; #declare b=4; /*1*/ cylinder{< b,-.3333,-1.*b >,<-1.*b,-.3333,b > ,r } /*2*/ cylinder{< b+.3333,0.,-1.*b >,<-1.*b+.3333,0.,b > ,r } /*3*/ cylinder{< b+.6667,.3333,-1.*b >,<-1.*b+.6667,.3333,b > ,r } /*4*/ cylinder{< 2.927*b+.2696,1.309*b+.637e-1,-1.*b >,<-2.927*b+.2696,-1.309*b+.637e-1,b > ,r } /*5*/ cylinder{< -1.*b,-.3333*b+.1111,0. >, ,r } /*6*/ cylinder{< 5.236*b+2.285,2.236*b+.8727,-1.*b >,<-5.236*b+2.285,-2.236*b+.8727,b > ,r } /*7*/ cylinder{< -2.342*b+.2412,.4472*b+.3903,-1.*b >,<2.342*b+.2412,-.4472*b+.3903,b > ,r } /*8*/ cylinder{< -3.*b-.3333,0.,-1.*b >,<3.*b-.3333,0.,b > ,r } /*9*/ cylinder{< -2.236*b+.1273,.764*b+.49e-1,-1.*b >,<2.236*b+.1273,-.764*b+.49e-1,b > ,r } /*10*/ cylinder{< -1.*b,b+.6667,.3333 >, ,r } /*11*/ cylinder{< -1.*b,b+.3333,0. >, ,r } /*12*/ cylinder{< -1.*b,b,-.3333 >, ,r } /*13*/ cylinder{< .4472*b+.3903,-2.342*b+.2412,-1.*b >,<-.4472*b+.3903,2.342*b+.2412,b > ,r } /*14*/ cylinder{< .764*b+.49e-1,-2.236*b+.1273,-1.*b >,<-.764*b+.49e-1,2.236*b+.1273,b > ,r } /*15*/ cylinder{< 0.,-3.*b-.3333,-1.*b >,<0.,3.*b-.3333,b > ,r } /*16*/ cylinder{< -1.*b,-3.*b-.3333,0. >, ,r } /*17*/ cylinder{< 1.309*b+.637e-1,2.927*b+.2696,-1.*b >,<-1.309*b+.637e-1,-2.927*b+.2696,b > ,r } /*18*/ cylinder{< 2.236*b+.8727,5.236*b+2.285,-1.*b >,<-2.236*b+.8727,-5.236*b+2.285,b > ,r } /*19*/ cylinder{< -.3333,b,-1.*b >,<-.3333,-1.*b,b > ,r } /*20*/ cylinder{< 0.,b+.3333,-1.*b >,<0.,-1.*b+.3333,b > ,r } /*21*/ cylinder{< .3333,b+.6667,-1.*b >,<.3333,-1.*b+.6667,b > ,r } /*22*/ cylinder{< -.4472*b-.569e-1,.342*b+.9217e-1,-1.*b >,<.4472*b-.569e-1,-.342*b+.9217e-1,b > ,r } /*23*/ cylinder{< -.3333*b+.1111,0.,-1.*b >,<.3333*b+.1111,0.,b > ,r } /*24*/ cylinder{< -.427*b-.1030,.1910*b+.4363,-1.*b >,<.427*b-.1030,-.1910*b+.4363,b > ,r } /*25*/ cylinder{< .1910*b+.4363,-.427*b-.1030,-1.*b >,<-.1910*b+.4363,.427*b-.1030,b > ,r } /*26*/ cylinder{< 0.,-.3333*b+.1111,-1.*b >,<0.,.3333*b+.1111,b > ,r } /*27*/ cylinder{< .342*b+.9217e-1,-.4472*b-.569e-1,-1.*b >,<-.342*b+.9217e-1,.4472*b-.569e-1,b > ,r } // VOIR A LA FIN L'OBTENTION DES "CYLINDER" AVEC MAPLE pigment{Red} finish {ambient 0.4 diffuse 0.5 roughness 0.001 reflection 0.02 specular .8} } poly{3, < 81,-189,-189,-9,-189,54,126,-189,126,-9,81,-189,-9,-189,126,-9,81,-9,-9,1 > // VOIR COEFFPOVRAY POUR OBTENIR CES COEFFICIENTS texture{ pigment{White*0.6} normal{ bumps 0.2 noise_generator 3} scale 0.015 finish {ambient 0.4 diffuse 0.5 roughness 0.001 reflection 0.02 specular .8} } }//fin poly /**/ clipped_by { sphere{ < 0,0,0 > , 1.5 translate < 0,0.2,0 > } } bounded_by { clipped_by } rotate <-30,-180,-27> scale 0.95 translate <0,-0.1,0> } text { ttf "times.ttf" "AE" 0.5,0 pigment { Cyan*1.2 } scale 0.08 rotate <0,40,0> translate <1.9,-1.3,-0.4> } /*================================================================================ Maple permet d'obtenir les 27 droites contenues dans la surface de Clebsch et de tracer ces droites et cette surface. Le graticiel de ray-tracing "PovRay.exe" permet d'obtenir un bien meilleur rendu de ces éléments avec gestion de textures, d'éclairages, du point de vue ...etc. Les calculs des différentes expressions nécessaires sont faites à l'aide de Maple et un "copier-coller" permet d'obtenir très rapidement le fichier "Povray" correspondant selon la surface selectionnée. ======================= Fichier Maple 1 ============================ ===== effectuant la recherche des droites et les tracés ============ ==================================================================== # --- déplacer le # pour selectionner la surface désirée #------------------ Cubique 1 (Clebsch) --------------------------- S:=81*(x^3+y^3+z^3)-189*(x^2*y+x^2*z+y^2*x+y^2*z+z^2*x+z^2*y)+54*x*y*z+ 126*(x*y+x*z+y*z)-9*(x^2+y^2+z^2)-9*(x+y+z)+1 ; #------------------ Cubique 2 (Clebsch) ---------------------------- # forme plus concise déduite de la formule du site de Todesco : #S:=64*x^3+48*x^2*z-192*y^2*x+48*y^2*z-31*z^3-54*z^2-24*z; #------------------ Cubique 4 ------------------------------------- #S := -18*x^3-36*x^2*z+18*x*y^2-18*x*z^2+18*z^3-12*x^2-12*x*z-3*z^2-2*x-z; #----------------- Cubique 5 (Cayley ) ---------------------------- # S:=expand((1-3*x- 3*y-3*z)*(x*y+x*z+y*z)+6*x*y*z); #------------------------------------------------------------------ resz:=subs(x=a*z+p,y=b*z+q,S):# droites à z non cst resx:=subs(y=a*x+p,z=b*x+q,S):# droites à x non cst resx0:=subs(x=p,z=q,S):# droites à x cst et z cst Hx:=collect(resx,x): Hx0:=collect(resx0,y):Hz:=collect(resz,z): Cz:=[seq(coeff(Hz,z,i),i=0..3)]: Cx:=[seq(coeff(Hx,x,i),i=0..3)]: Cx0:=[seq(coeff(Hx0,y,i),i=0..3)]: solutionsz :=map(allvalues,{solve({seq(Cz[i]=0,i=1..4)},{a,b,p,q})}): solz:=map(u -> subs(op(u),[a*z+p,b*z+q,z]),solutionsz): seq(print(cat(`droite n = `,i,` `),solz[i]),i=1..nops(solz)); printf("%s %a\n","nbre droites non horizontales = ",nops(solz)); solutionsx0 :=map(allvalues,{solve({seq(Cx0[i]=0,i=1..4)},{p,q})}): solx0:=map(u -> subs(op(u),[p,y,q]),solutionsx0): seq(print(cat(`droite n = `,nops(solz)+i,` `),solx0[i]), i=1..nops(solx0)); printf("%s %a\n","nbre droites horizontales avec x cste = ",nops(solx0)); solutionsx :=map(allvalues,{solve({seq(Cx[i]=0,i=1..4)},{a,b,p,q})}): #----- on supprime les solutions qui sont à z non constant --------- solutionsxbis:=NULL: for i to nops(solutionsx) do if member(b=0 , solutionsx[i]) then solutionsxbis:=solutionsxbis,solutionsx[i] fi; od: solutionsxbis:={solutionsxbis}: solx:=map(u -> subs(op(u),[x,a*x+p,b*x+q]),solutionsxbis): seq(print(cat(`droite n = `,nops(solz)+nops(solx0)+i,` `),solx[i]), i=1..nops(solx)); printf("%s %a\n", "nbre droites horizontales avec x non cste = ",nops(solx)); printf("%s %a\n","nombre de droites contenues dans la surface = ", nops(solx)+nops(solz)+nops(solx0)); droites:=subs(x=t,y=t,z=t,[op(solx0),op(solx),op(solz)]): # ---------- graphes -------------------- with(plots): deb:=-1: fin :=1:debt:=-1:fint:=1:# pour la 4-ième r:=0.005*(fint-debt); g_droites:= tubeplot({op(droites)},radius=r,t=debt..fint,numpoints=2, color=magenta,style=patchnogrid): surf:=implicitplot3d(S,x=deb..fin,y=deb..fin,z=debt..fint,style=patchnogrid,grid=[50,50,50]): plotsetup(window); #plotsetup(jpeg,plotoutput="c:/clebsch.jpg",plotoptions="height=600, width=600"): display([surf,g_droites],scaling=constrained,view=[deb..fin,deb..fin,debt..fint], orientation=[60,70],light=[30,40,0.9,0.9,0],light=[120,20,0.8,0.6,0]); ==================== fin du fichier Maple 1 ============================== ================================================================================ =============== Obtention des droites pour le fichier PovRay =================== Les droites sont représentées par des cylindres de très petit rayon r=0.02. la suite d'instructions "cylinder{ , , r}" est obtenue avec les instructions Maple suivantes ( à effectuer après fichier Maple précédent ) --------------------- # -b, b : paramètres des ext. de l'axe des cylindres pr:=5: # précision for i to nops(droites) do printf("%s %a,%a,%a %s%a,%a,%a %s // %d \n", "cylinder{<",op(evalf(subs(t=-b,droites[i]),pr)),">,<", op(evalf(subs(t=b,droites[i]),pr)),"> ,r }",i); od: # on fait un "copier-coller" du résultat --------------------- ================================================================================ */