/* * Draws the plant. */ void drawPlant(int i,float scale,float radscale,int string) { char *ptr = lsystem[string]; char ch[] = { '\0','\0' }; GLfloat c1[] = { 0.6549f,0.4901f,0.2392f }; /* light brown */ GLfloat c2[] = { 0.3607f,0.2510f,0.2000f }; /* dark brown */ GLfloat c3[] = { 0.1373f,0.5568f,0.1373f }; /* forest green */ if(i==0) return; PushMatrix(); while(*ptr != '\0') { switch(*ptr) { case 'F': Rotate(tilt/10000,0.0,0.0,1.0); /* tilt very very slightly */ LoadMatrix(); if(do_growth && floor(growth)==i) { draw_branch(LENGTH*scale*(growth-1),RADIUS*radscale,BASE_TRI,c1,c2); Translate(0.0,LENGTH*scale*(growth-1),0.0); } else { draw_branch(LENGTH*scale,RADIUS*radscale,BASE_TRI,c1,c2); Translate(0.0,LENGTH*scale,0.0); } break; case '[': PushMatrix(); break; case ']': PopMatrix(); break; case 'L': if(do_growth && floor(growth)==i) draw_leaf(4*(growth-1)*scale,1*(growth-1)*scale,25,c3); else draw_leaf(4*scale,1*scale,25,c3); break; case 'R': Rotate(yrotate,0.0,1.0,0.0); break; case 'T': Rotate(tilt,0.0,0.0,1.0); break; default: if(isdigit(*ptr)) { ch[0] = *ptr; drawPlant(i-1,scale*SCALE,radscale*RADSCALE,atoi(ch)); } break; } ptr++; } PopMatrix(); }
void draw_hyperbolic_arc(double x0, double y0, double a, double b, double f, double g, double c, double s) { double e; e = Atan(b/get_max(x0, y0)); if (f < -e) draw_branch(-180 + e, -e, x0, y0, a, b, f, g, c, s); if (g > e) draw_branch(e, 180 - e, x0, y0, a, b, f, g, c, s); }
void CTreepadView::draw_branch(vector<Branch> b,int k) { k--; if (!k) { return; } double angle; double lenth; double rat1; //分支点位置与主干长度的比例 double rat2; //分支长度与主干长度的比例 CClientDC dc(this); CPen pen(PS_SOLID, (int)(dam*pow(dec,iter-k)), color); dc.SelectObject(&pen); for (UINT i = 0; i < b.size(); ++i) { vector<Branch> sub; for (UINT j = 0; j < b.size(); ++j) { rat1 = getLen(tree.getStart(), tree[j].getStart()) / tree.lenth; CPoint *p=new CPoint(b[i].getStart().x + (int)(rat1*b[i].lenth*cos(b[i].angle)), b[i].getStart().y + (int)(rat1*b[i].lenth*sin(b[i].angle))); angle = b[i].angle + tree[j].angle - tree.angle; rat2 = tree[j].lenth / (double)tree.lenth; lenth = b[i].lenth*rat2; dc.MoveTo(*p); dc.LineTo(int(p->x + lenth*cos(angle)), int(p->y + lenth*sin(angle))); sub.push_back(Branch(*p, angle, lenth)); } draw_branch(sub, k); } ReleaseDC(&dc); }
void CTreepadView::paint() { CClientDC dc(this); CPen pen(PS_SOLID, dam, color); dc.SelectObject(&pen); cx = GetSystemMetrics(SM_CXFULLSCREEN); cy = GetSystemMetrics(SM_CYFULLSCREEN); tree.updateBranch(); dc.MoveTo(map(tree.getStart())); dc.LineTo(map(tree.getEnd())); for (UINT i = 0; i < tree.size(); ++i) { dc.MoveTo(map(tree[i].getStart())); dc.LineTo(map(tree[i].getEnd())); } draw_branch(tree.branch,iter); ReleaseDC(&dc); }
void imp_node_open(bip_context* c, int* vars, int* parents, int num) { FILE* report = c->report_buffer; fprintf(report, "\\subsection{%s %i}\n", "Subproblem", num); bool branch = draw_branch(vars, parents, c->num_vars, num); if(branch) { fprintf(report, "\\marginpar{%%\n"); fprintf(report, " \\vspace{0.6cm}\n"); fprintf(report, " \\includegraphics[width=\\marginparwidth]" "{reports/branch%i.pdf}\n", num); fprintf(report, " \\captionof{figure}{Subproblem %i branch.}\n",num); fprintf(report, "}\n"); } else { fprintf(report, "\\marginpar{ERROR: Unable to generate branch %i}\n", num); } fprintf(report, "\n"); }