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 | }; |