Subversion Repositories wimsdev

Rev

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

Rev Author Line No. Line
16992 bpr 1
!set slib_header_deploiement=\
16994 bpr 2
deplacement_poly3D (a,b,nab,f2D,i1,i2,tt)={\
16992 bpr 3
  /* a et b sont deux points 3D, nab est un vecteur unitaire ortho à (a,b)\
4
     f2D[i1],f2D[i2] est un segment 2D de même longueur que (a,b).\
5
     Il existe un unique déplacement 3D qui envoie (f2D[i1],0) sur a,\
6
     (f2D[i2],0) sur b, et le vecteur k=(0,0,1) sur un vecteur w3 faisant un angle\
16994 bpr 7
     tt avec nab. On calcule l'image par ce déplacement de f2Dx(0) et w3 */\
8
  my(v=normalise(f2D[i2]-f2D[i1]),c=cos(tt),s=sin(tt));\
16992 bpr 9
  my(w1=normalise(b-a),aux=wedge(nab,w1),w2=c*aux+s*nab,w3=c*nab-s*aux);\
10
  my(m=[v[1],-v[2];v[2],v[1]]*matconcat([w1~,w2~])~);\
11
  my(dec=a-f2D[i1]*m);\
12
  [vector(#f2D, i, f2D[i]*m + dec),w3];\
13
};\
14
\
15
etale3D(v,f,f2D,ns,no,t)={\
17039 bpr 16
  /* v est un arbre couvrant du graphe des faces donne par sa fonction de direction vers la dernière face,\
16992 bpr 17
  // f contient les numeros des sommets des faces en 3D\
18
  // f2D contient les coordonnees 2D de projections des faces\
19
  // ns est le nombre de sommets du polyedre\
17039 bpr 20
  // no est la liste des normales aux faces\
16992 bpr 21
  // le resultat est la liste des coordonnées 3D des sommets du déploiement\
22
  // t est un paramètre entre 0 et 1. Pour t = 1 on doit trouver le polyèdre,\
23
  // posé sur sa dernière face dans le plan xOy. Pour t = 0, on doit trouver\
24
  // le patron, dans le même plan\
25
  */\
26
  my(r=f2D[#f],nbs,l,s3D=vector(2*ns-2),cor=vector(#f),nno=vector(#f));\
27
  cor[#f]=vector(#r+1,x,if(x==1,#r,x-2)); nno[#f]=[0,0,1];\
17039 bpr 28
  for(k=1,#r,s3D[k]=[r[k][1],r[k][2],0]);\
16992 bpr 29
  nbs = #r;\
30
  for(kk=1,#f-1,\
31
    while(#cor[kk]==0,\
32
      l=kk; while(#cor[v[l]]==0,l=v[l]);\
33
      [i1,j1,i2,j2]=adj(f[l],f[v[l]]);\
34
      qr=deplacement_poly3D(s3D[cor[v[l]][j1]+1],s3D[cor[v[l]][j2]+1],nno[v[l]],\
35
      f2D[l],i1-1,i2-1,t*acos(no[l]*no[v[l]]~));\
36
      r=qr[1];nno[l]=qr[2];\
37
      rr=vector(#r+1);\
38
      rr[1]=#r;\
39
      rr[i1]=cor[v[l]][j1];\
40
      rr[i2]=cor[v[l]][j2];\
41
      for(k=2,#r+1,if(k!=i1 && k!=i2,\
42
        rr[k]=nbs; nbs+=1; s3D[nbs]=r[k-1]));\
43
      cor[l]=rr));\
44
  return(s3D);\
45
};