Пример #1
0
/*
 * 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();
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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");
}