Region *Region::split(double pos, unsigned int dir) { Region *newR = NULL; bool first = true; if (dir & R_VERT) { newR = splitDir(pos, R_UP, first); if (_down) _down->splitDir(pos, R_DOWN); } else if (dir & R_HORI) { newR = splitDir(pos, R_RIGHT, first); if (_left) _left->splitDir(pos, R_LEFT); } return newR; }
void drawTree(FastVoxelView &vv,Pos3D base,float h) { Pos3D p1(0,0,0),p2(0,0,0),p3(0,0,0); Color c(0x99,0x69,0); Color bc(0,0xAA,0); p1=base; p2=base+Pos3D(0,1,0)*h*0.25; p3=base+Pos3D(0,1,0)*h*0.5; cdebug(p1<<p2<<p3); Trunk t(p1,p2,p3,7,5); std::list<Trunk> tlist,nlist; tlist.push_back(t); int rw=h/4; float angle=M_PI/1.5; // 30 degrees int last=5; for(int i=0;i<=last;i++) { std::cout<<"_______________"<<std::endl; std::list<Trunk>::iterator k=tlist.begin(); for(;k!=tlist.end();k++) { Pos3D dir=k->p3 - k->p2; int count=4; std::list<Pos3D> l=splitDir(dir,count,angle,M_PI/count/8.0,0);//M_PI/count,angle/3); std::list<Pos3D>::iterator j=l.begin(); for(;j!=l.end();j++) { Pos3D r=*j; r=r*rw; int mi=i+1; // c=Color(mi&1,(mi>>1)&1,(mi>>2)&1); /* drawBall(vv,k->p1,4,c); drawBall(vv,k->p2,3,c); drawBall(vv,k->p3,2,c);*/ draw3Line(vv,k->p1,k->p2,k->p3,c,40,k->w1,k->w2); if(i==last) draw3Line(vv,k->p1,k->p2,k->p2,bc,4,2,1); float start=0.6; start+=getRandEq()*0.3; Pos3D sp=bezier(start, k->p1,k->p2,k->p3); // Pos3D np(k->p3*2-k->p2+Pos3D(rx,ry,rz)); Pos3D np(k->p3*2-k->p2+r); Trunk nt(sp, sp*0.5+np*0.5+getRandPos(rw), np, k->w2,k->w2-1); nlist.push_back(nt); } } rw*=0.9; tlist.clear(); cdebug(nlist.size()); tlist=nlist; nlist.clear(); } // roots std::list<Pos3D> l=splitDir(Pos3D(0,-1,0),4,M_PI/4,0,0); std::list<Pos3D>::iterator j=l.begin(); for(;j!=l.end();j++) { Pos3D n=*j * 10 + base; draw3Line(vv,base,base*0.5+n*0.5,n,c,40,t.w1,t.w2); } }