Subversion Repositories wimsdev

Rev

Rev 16992 | Go to most recent revision | 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)={\
16
  /* v est un arbre couvrant du graphe des faces,\
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\
20
  // le resultat est la liste des coordonnées 3D des sommets du déploiement\
21
  // t est un paramètre entre 0 et 1. Pour t = 1 on doit trouver le polyèdre,\
22
  // posé sur sa dernière face dans le plan xOy. Pour t = 0, on doit trouver\
23
  // le patron, dans le même plan\
24
  */\
25
  my(r=f2D[#f],nbs,l,s3D=vector(2*ns-2),cor=vector(#f),nno=vector(#f));\
26
  cor[#f]=vector(#r+1,x,if(x==1,#r,x-2)); nno[#f]=[0,0,1];\
27
  for(k=1,#r,s3D[k]=[r[k][1],r[k][2],-1]);\
28
  nbs = #r;\
29
  for(kk=1,#f-1,\
30
    while(#cor[kk]==0,\
31
      l=kk; while(#cor[v[l]]==0,l=v[l]);\
32
      [i1,j1,i2,j2]=adj(f[l],f[v[l]]);\
33
      qr=deplacement_poly3D(s3D[cor[v[l]][j1]+1],s3D[cor[v[l]][j2]+1],nno[v[l]],\
34
      f2D[l],i1-1,i2-1,t*acos(no[l]*no[v[l]]~));\
35
      r=qr[1];nno[l]=qr[2];\
36
      rr=vector(#r+1);\
37
      rr[1]=#r;\
38
      rr[i1]=cor[v[l]][j1];\
39
      rr[i2]=cor[v[l]][j2];\
40
      for(k=2,#r+1,if(k!=i1 && k!=i2,\
41
        rr[k]=nbs; nbs+=1; s3D[nbs]=r[k-1]));\
42
      cor[l]=rr));\
43
  return(s3D);\
44
};