76 lines
1.9 KiB
Text
76 lines
1.9 KiB
Text
static ratio = .75;
|
|
static branchlength = 60;
|
|
static max_branches = 4;
|
|
struct vec3{x,y,z;};
|
|
()
|
|
{
|
|
t=klock();
|
|
srand(t * 1);
|
|
zero1 = .5+.5*cos(t);
|
|
maxbranches = int( 1+1 + zero1*5);
|
|
|
|
|
|
cls(0); clz(1e32);
|
|
distcam = -70;
|
|
camrot = .5 * t;
|
|
ca=distcam * cos(camrot);
|
|
sa=distcam * sin(camrot);
|
|
setcam(sa,-50,ca,camrot,0);
|
|
|
|
angle = 2*pi / 8;
|
|
branchlen = 10+50 * zero1;
|
|
tree(maxbranches, 0, branchlen, 0,0,0, pi / 2, 0, angle);
|
|
|
|
moveto(0,0);
|
|
printf("N=%g, frame=%5.0f, cam:%3.0f", maxbranches, numframes, camrot / pi * 180);
|
|
printf("\n%gx%g",xres,yres);
|
|
sleep(16);
|
|
}
|
|
|
|
|
|
tree(mb, n, blen, x,y,z, ang_yx, ang_yz, angle) {
|
|
n++; if( n> mb ) return;
|
|
len = blen / n * ratio;
|
|
c = 64 + 128 * n/7; setcol(100,c,38);
|
|
|
|
dx=0; dy=0; dz=0;
|
|
double mat[9];
|
|
vec3 axis = {0,0,1};
|
|
ang2mat(ang_yz, ang_yx, mat);
|
|
transformPoint(axis,mat);
|
|
dx=axis.x;
|
|
dy=-axis.y;
|
|
dz=axis.z;
|
|
|
|
ox = x; oy = y; oz = z;
|
|
x += len * dx;
|
|
y += -len * dy;
|
|
z += len * dz;
|
|
|
|
rd = 8 / n;
|
|
rd2 = 7 / (n+1);
|
|
drawcone(ox,oy,oz,rd,x,y,z,rd2,DRAWCONE_FLAT + DRAWCONE_NOPHONG);
|
|
|
|
nextangle = /*(-.5+1*rnd*pi) * */angle;
|
|
tree(mb, n, blen, x, y, z, ang_yx - angle, ang_yz, nextangle);
|
|
tree(mb, n, blen, x, y, z, ang_yx + angle, ang_yz, nextangle);
|
|
|
|
tree(mb, n, blen, x, y, z, ang_yx, ang_yz - angle, nextangle);
|
|
tree(mb, n, blen, x, y, z, ang_yx, ang_yz + angle, nextangle);
|
|
}
|
|
|
|
ang2mat(hang,vang,mat[9]) {
|
|
mat[6] = cos(vang)*sin(hang); mat[0] = cos(hang);
|
|
mat[7] = sin(vang); mat[1] = 0;
|
|
mat[8] = cos(vang)*cos(hang); mat[2] =-sin(hang);
|
|
mat[3] = mat[7]*mat[2] - mat[8]*mat[1];
|
|
mat[4] = mat[8]*mat[0] - mat[6]*mat[2];
|
|
mat[5] = mat[6]*mat[1] - mat[7]*mat[0];
|
|
}
|
|
|
|
transformPoint(vec3 v, thisRot[9]) {
|
|
NewX = v.x * thisRot[0] + v.y * thisRot[1] + v.z * thisRot[2];
|
|
NewY = v.x * thisRot[3] + v.y * thisRot[4] + v.z * thisRot[5];
|
|
NewZ = v.x * thisRot[6] + v.y * thisRot[7] + v.z * thisRot[8];
|
|
v.x=newx; v.y=newy; v.z=newz;
|
|
}
|