Subversion Repositories wimsdev

Rev

Rev 16994 | Blame | Compare with Previous | Last modification | View Log | RSS feed

!set slib_header_deploiement=\
deplacement_poly3D (a,b,nab,f2D,i1,i2,tt)={\
  /* a et b sont deux points 3D, nab est un vecteur unitaire ortho à (a,b)\
     f2D[i1],f2D[i2] est un segment 2D de même longueur que (a,b).\
     Il existe un unique déplacement 3D qui envoie (f2D[i1],0) sur a,\
     (f2D[i2],0) sur b, et le vecteur k=(0,0,1) sur un vecteur w3 faisant un angle\
     tt avec nab. On calcule l'image par ce déplacement de f2Dx(0) et w3 */\
  my(v=normalise(f2D[i2]-f2D[i1]),c=cos(tt),s=sin(tt));\
  my(w1=normalise(b-a),aux=wedge(nab,w1),w2=c*aux+s*nab,w3=c*nab-s*aux);\
  my(m=[v[1],-v[2];v[2],v[1]]*matconcat([w1~,w2~])~);\
  my(dec=a-f2D[i1]*m);\
  [vector(#f2D, i, f2D[i]*m + dec),w3];\
};\
\
etale3D(v,f,f2D,ns,no,t)={\
  /* v est un arbre couvrant du graphe des faces donne par sa fonction de direction vers la dernière face,\
  // f contient les numeros des sommets des faces en 3D\
  // f2D contient les coordonnees 2D de projections des faces\
  // ns est le nombre de sommets du polyedre\
  // no est la liste des normales aux faces\
  // le resultat est la liste des coordonnées 3D des sommets du déploiement\
  // t est un paramètre entre 0 et 1. Pour t = 1 on doit trouver le polyèdre,\
  // posé sur sa dernière face dans le plan xOy. Pour t = 0, on doit trouver\
  // le patron, dans le même plan\
  */\
  my(r=f2D[#f],nbs,l,s3D=vector(2*ns-2),cor=vector(#f),nno=vector(#f));\
  cor[#f]=vector(#r+1,x,if(x==1,#r,x-2)); nno[#f]=[0,0,1];\
  for(k=1,#r,s3D[k]=[r[k][1],r[k][2],0]);\
  nbs = #r;\
  for(kk=1,#f-1,\
    while(#cor[kk]==0,\
      l=kk; while(#cor[v[l]]==0,l=v[l]);\
      [i1,j1,i2,j2]=adj(f[l],f[v[l]]);\
      qr=deplacement_poly3D(s3D[cor[v[l]][j1]+1],s3D[cor[v[l]][j2]+1],nno[v[l]],\
      f2D[l],i1-1,i2-1,t*acos(no[l]*no[v[l]]~));\
      r=qr[1];nno[l]=qr[2];\
      rr=vector(#r+1);\
      rr[1]=#r;\
      rr[i1]=cor[v[l]][j1];\
      rr[i2]=cor[v[l]][j2];\
      for(k=2,#r+1,if(k!=i1 && k!=i2,\
        rr[k]=nbs; nbs+=1; s3D[nbs]=r[k-1]));\
      cor[l]=rr));\
  return(s3D);\
};