#==== un polydre non convexe : polyèdre régulier étoilé restart: with(geom3d): with(plots): #---- équation du plan passant par 3 points [x1,y1,z1], [x2,y2,z2],[x3,y3,z3] ------------- EQplan:= proc(x1,y1,z1,x2,y2,z2,x3,y3,z3) (y1*z2-y1*z3-y2*z1+y2*z3+y3*z1-y3*z2)*x+ (-x1*z2+x1*z3+x2*z1-x2*z3-x3*z1+x3*z2)*y+ (x1*y2-x1*y3-x2*y1+x2*y3+x3*y1-x3*y2)*z -x1*y2*z3+x1*y3*z2+x2*y1*z3-x2*y3*z1-x3*y1*z2+x3*y2*z1: end: montube:=proc(L,r,col) local n : n:=nops(L): seq(tubeplot( expand(L[i,1]+t*(L[i,2]-L[i,1])),t=0..1,radius=r,grid=[3,20],color=col),i=1..n): end: lg:=sqrt(3): dodecahedron(gon,point(A,[0,0,0]),lg): Lfaces:=evalf(faces(gon)): #nops(Lfaces); #==== On crée une stellation du cube ==== centrer:= u -> add(u[i],i=1..nops(u))/nops(u): coef:=2.5: Lfaces := map(u ->[u, seq([u[i],u[(i mod nops(u))+1],coef*centrer(u)],i=1..nops(u))],Lfaces): Laretes:={seq(seq(seq({Lfaces[k,i,j],Lfaces[k,i,j mod nops(Lfaces[k,i]) +1]},j=1..nops(Lfaces[k,i])),i=1..nops(Lfaces[k])),k=1..nops(Lfaces))}: #==== liste des faces des 6 pyramides construites sur chaque face du cube Leq_faces:=map( w -> map( u -> EQplan(op(u[1]),op(u[2]),op(u[3])),w),Lfaces): LEQ_faces_sign:=NULL: for i to nops(Lfaces) do cell:=Lfaces[i]: eq:=Leq_faces[i]: #=== équations des faces de cell ==== som_cell:=convert(map(op,cell),set); centre:=add(som_cell[k],k=1..nops(som_cell))/nops(som_cell); lessign:=map(w -> sign(evalf(subs(x=centre[1],y=centre[2],z=centre[3],w))),eq) ; LEQ_faces_sign:=LEQ_faces_sign,[seq(eq[i]*lessign[i],i=1..nops(cell)) ]; od: LEQ_faces_sign:=[LEQ_faces_sign]: #===== liste des équations( avec le "bon" signe) des faces des 6 pyramides) K:=3: #---- régler selon le polyèdre -------- npas:=80: display([ implicitplot3d( max(seq(min(op(LEQ_faces_sign[i]) ),i=1..nops(LEQ_faces_sign) ) )=0 , x=-K..K,y=-K..K,z=-K..K,grid=[npas,npas,npas],color=cyan,style=patchnogrid,transparency=0.5) ,montube(Laretes,0.02,gold) #---- tracé des arêtes du polyèdre ] ,style=patchnogrid,scaling=constrained,axes=none);