12 Nov 2007

## Official Asymptote example – dragon

 (Compiled with Asymptote version 2.14svn-r5318)
```/* This code comes from The Official Asymptote Gallery */

pair crease(pair z1, pair z2, bool left)
{
pair dz = z2 - z1;

if (left)
return z1 + dz * (0.5, 0.5);
else
return z1 + dz * (0.5, -0.5);
}

pair[] fold(pair[] oldz)
{
int n = oldz.length;
pair[] newz = new pair[2n-1];

for (int i = 0; i < n-1; ++i)
{
newz[2i] = oldz[i];
newz[2i+1] = crease(oldz[i], oldz[i+1], i%2==0);
}

newz[2(n-1)] = oldz[n-1];

return newz;
}

pair[] dragon(int n, pair[] base={})
{
if (base.length == 0)
if (n%2 == 0)
base = new pair[] {(0,0), (1,1) };
else
base = new pair[] {(0,0), (1,0) };

pair[] z = base;

for (int i = 1; i < n; ++i)
z = fold(z);

return z;
}

void drawtris(pair[] z, pen p = currentpen)
{
int n = z.length;

for (int i = 0; i < n-2; i+=2)
fill(z[i]--z[i+1]--z[i+2]--cycle, p);
}

void drawtris(pair[] z, pen p1, pen p2)
{
int n = z.length;

for (int i = 0; i < n-2; i+=2)
fill(z[i]--z[i+1]--z[i+2]--cycle, 2i < n-1 ? p1 : p2);
}

size(500,0);

int n = 10;

drawtris(dragon(n, new pair[] {(0,0), (1,0)}), black);
drawtris(dragon(n, new pair[] {(0,0), (0,-1)}), blue);
drawtris(dragon(n, new pair[] {(0,0), (-1,0)}), red);
drawtris(dragon(n, new pair[] {(0,0), (0,1)}),  green);

```

Étiquettes : ,