summaryrefslogtreecommitdiff
path: root/graphics/asymptote/examples/soccerball.asy
blob: 5cf0f015055003300dfe2289536bd075c98c8005 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import graph3;
size(400);
currentlight.background=palegreen;

defaultrender=render(compression=Zero,merge=true);

real c=(1+sqrt(5))/2;
 
triple[] z={(c,1,0),(-c,1,0),(-c,-1,0),(c,-1,0)};
triple[] x={(0,c,1),(0,-c,1),(0,-c,-1),(0,c,-1)};
triple[] y={(1,0,c),(1,0,-c),(-1,0,-c),(-1,0,c)};
 
triple[][] Q={
  {z[0],y[1],x[3],x[0],y[0],z[3]},
  {z[1],x[0],x[3],y[2],z[2],y[3]},
  {z[2],z[1],y[2],x[2],x[1],y[3]},
  {z[3],z[0],y[0],x[1],x[2],y[1]},
  {x[0],x[3],z[1],y[3],y[0],z[0]},
  {x[1],x[2],z[2],y[3],y[0],z[3]},
  {x[2],x[1],z[3],y[1],y[2],z[2]},
  {x[3],x[0],z[0],y[1],y[2],z[1]},
  {y[0],y[3],x[1],z[3],z[0],x[0]},
  {y[1],y[2],x[2],z[3],z[0],x[3]},
  {y[2],y[1],x[3],z[1],z[2],x[2]},
  {y[3],y[0],x[0],z[1],z[2],x[1]} 
};
 
int nArc=4;

path3 p=Arc(O,Q[0][0],Q[0][1],nArc);
real R=abs(point(p,reltime(p,1/3)));
 
triple[][] P;
for(int i=0;i < Q.length;++i){
  P[i]=new triple[] ;
  for(int j=0;j < Q[i].length;++j){
    P[i][j]=Q[i][j]/R;
  } 
} 
 
// FIXME: Use a baryicentric coordinate mesh
surface sphericaltriangle(triple center, triple A, triple B, triple C,
                          int nu=3, int nv=nu) {
  path3 tri1=Arc(center,A,B,nArc);
  path3 tri2=Arc(center,A,C,nArc);
  path3 tri3=Arc(center,B,C,nArc);
  triple tri(pair p) {
    path3 cr=Arc(O,relpoint(tri2,p.x),relpoint(tri3,p.x),nArc);
    return relpoint(cr,p.y);
  };
 
  return surface(tri,(0,0),(1-sqrtEpsilon,1),nu,nv,Spline);
} 
 
for(int i=0;i < P.length;++i){
  triple[] pentagon=sequence(new triple(int k) {
      path3 p=Arc(O,P[i][0],P[i][k+1],nArc);
      return point(p,reltime(p,1/3));
    },5);
  pentagon.cyclic=true;
  draw(sequence(new path3(int k) {
        return Arc(O,pentagon[k],pentagon[k+1],nArc);},5),linewidth(2pt));
  triple M=unit(sum(pentagon)/5);
  for(int i=0;i < 5;++i){
    surface sf=sphericaltriangle(O,pentagon[i],M,pentagon[i+1]);
    draw(sf,black);
  } 
} 

for(int i=0;i < P.length;++i) {
  for(int j=1;j <= 5;++j) {
    triple K=P[i][0];
    triple A=P[i][j];
    triple B=P[i][(j % 5)+1];
    path3[] p={Arc(O,K,A,nArc),Arc(O,A,B,nArc),Arc(O,B,K,nArc)};
    draw(subpath(p[0],reltime(p[0],1/3),reltime(p[0],2/3)),linewidth(4pt));
    triple[] hexagon={point(p[0],reltime(p[0],1/3)),
                      point(p[0],reltime(p[0],2/3)),
                      point(p[1],reltime(p[1],1/3)),
                      point(p[1],reltime(p[1],2/3)),
                      point(p[2],reltime(p[2],1/3)),
                      point(p[2],reltime(p[2],2/3))};
    hexagon.cyclic=true;
    triple M=unit(sum(hexagon)/6);
    for(int i=0;i < 6;++i) {
      surface sf=sphericaltriangle(O,hexagon[i],M,hexagon[i+1]);
      draw(sf,white);
    } 
  } 
}