Exemple #1
0
void cohenclipanddraw(double xz,double yz,double xo,double yo)
{
  outcode outcode0,outcode1,outcodeout;
  double sx,sy,vx0,vy0,vx1,vy1;
  int accept=0,done=0;
  outcode0=computecode(xz,yz);
  outcode1=computecode(xo,yo);

  do
  {
    if(!(outcode0|outcode1))
    {
      accept=1;
      done=1;
    }
    else if(outcode0&outcode1)
      done=1;
    else
    {
      double x,y;
      outcodeout=outcode0?outcode0:outcode1;
      if(outcodeout&TOP)
      {
        x=xz+(xo-xz)*(ymax-yz)/(yo-yz);
        y=ymax;
      }
      else if(outcodeout&BOTTOM)
      {
        x=xz+(xo-xz)*(ymin-yz)/(yo-yz);
        y=ymin;
      }
      else if(outcodeout&RIGHT)
      { 
        y=yz+(yo-yz)*(xmax-xz)/(xo-xz);
        x=xmax;
      }
      else
      { 
        y=yz+(yo-yz)*(xmin-xz)/(xo-xz);
        x=xmin;
      }
      if(outcodeout==outcode0)
      {
        xz=x;yz=y;
        outcode0=computecode(xz,yz);
      }
      else
      {
        xo=x;yo=y;
        outcode1=computecode(xo,yo);
      }
    }
  }
  while(!done);

  glColor3f(0.0,1.0,0.0);
  glBegin(GL_LINE_LOOP);
    glVertex2f(xvmin,yvmin);
    glVertex2f(xvmax,yvmin);
    glVertex2f(xvmax,yvmax);
    glVertex2f(xvmin,yvmax);
  glEnd();

  if(accept)
  {
    sx=(xvmax-xvmin)/(xmax-xmin);
      sy=(yvmax-yvmin)/(ymax-ymin);

      vx0=xvmin+(xz-xmin)*sx;
      vy0=yvmin+(yz-ymin)*sy;
      vx1=xvmin+(xo-xmin)*sx;
      vy1=yvmin+(yo-ymin)*sy;
  
      glColor3f(1.0,0.0,0.0);
      glBegin(GL_LINES);
           glVertex2f(vx0,vy0);
           glVertex2f(vx1,vy1);
      glEnd();
  }
}
Exemple #2
0
void cohensutherland(double x0, double y0, double x1, double y1)
{
	int o0,o1,out;
	bool accept=false, done=false;
	o0=computecode(x0,y0);
	o1=computecode(x1,y1);

	do
	{
		if(!(o0|o1))
		{
			accept=true;
			done=true;
		}
		else if(o0&o1)
			done=true;
		else
		{
			double x,y;
			out = o0?o0:o1;

			if(out&RIGHT)
			{
				x=xmax;
				y=y0+(y1-y0)*(xmax-x0)/(x1-x0);
			}
			else if(out&LEFT)
			{
				x=xmin;
				y=y0+(y1-y0)*(xmin-x0)/(x1-x0);
			}
			else if(out&TOP)
			{
				y=ymax;
				x=x0+(x1-x0)*(ymax-y0)/(y1-y0);
			}
			else
			{
				y=ymin;
				x=x0+(x1-x0)*(ymin-y0)/(y1-y0);
			}
			
			if(out==o0)
			{
				x0=x;
				y0=y;
				o0=computecode(x0,y0);
			}
			else
			{
				x1=x;
				y1=y;
				o1=computecode(x1,y1);
			}
		}
	}
	while(!done);

	if(accept)
	{
		double sx=(xvmax-xvmin)/(xmax-xmin);
		double sy=(yvmax-yvmin)/(ymax-ymin);
		double vx0=xvmin+(x0-xmin)*sx;
		double vy0=yvmin+(y0-ymin)*sy;
		double vx1=xvmin+(x1-xmin)*sx;
		double vy1=yvmin+(y1-ymin)*sy;

		glColor3f(0.0,0.0,1.0);
		glBegin(GL_LINE_LOOP);
		glVertex2f(xvmin,yvmin);
		glVertex2f(xvmin,yvmax);
		glVertex2f(xvmax,yvmax);
		glVertex2f(xvmax,yvmin);
		glEnd();

		glColor3f(0.0,1.0,0.0);
		glBegin(GL_LINES);
		glVertex2d(vx0,vy0);
		glVertex2d(vx1,vy1);
		glEnd();
	}
}