Example #1
0
static void
segment_poly(RasterPoint* pt, const int x, const int y,
             const int radius, const unsigned istart, const unsigned iend,
             unsigned &npoly, const bool forward=true)
{
  assert(istart < ARRAY_SIZE(ISINETABLE));
  assert(iend < ARRAY_SIZE(ISINETABLE));

  // add start node
  pt[npoly++] = CirclePoint(x, y, radius, istart);

  // add intermediate nodes (if any)
  if (forward) {
    const unsigned ilast = istart < iend ? iend : iend + 4096;
    for (unsigned i = istart + 4096 / 64; i < ilast; i += 4096 / 64) {
      const unsigned angle = i & 0xfff;
      pt[npoly] = CirclePoint(x, y, radius, angle);

      if (pt[npoly].x != pt[npoly-1].x || pt[npoly].y != pt[npoly-1].y)
        npoly++;
    }
  } else {
    const unsigned ilast = istart > iend ? iend : iend - 4096;
    for (int i = istart + 4096 / 64; i > (int)ilast; i -= 4096 / 64) {
      const unsigned angle = i & 0xfff;
      pt[npoly] = CirclePoint(x, y, radius, angle);

      if (pt[npoly].x != pt[npoly-1].x || pt[npoly].y != pt[npoly-1].y)
        npoly++;
    }
  }

  // and end node
  pt[npoly++] = CirclePoint(x, y, radius, iend);
}
Example #2
0
void TGUI_DrawRound(int x0,int y0,int r,int color)
{
	int x,y,d;
	x=0;
	y=r;
	d=1-r;
	CirclePoint(x,y,x0,y0,color);
	while(x<=y)
	{
		if(d<0){d+=2*x+3;x++;}
		else{d+=2*(x-y)+5;x++;y--;}
		CirclePoint(x,y,x0,y0,color);
	}
}
Example #3
0
void TGUI_DrawRound2(uint16 X0,uint16 Y0,uint16 R0,uint16 Xo,uint16 Color)
{
	uint16 X,Y,RR,XX;
	RR=R0*R0;
	for(X=0;X<R0;X++)
	{
		XX=X*X;
		for(Y=0;Y<=R0;Y++)
		{
			if(fabs((XX+Y*Y)<RR)&&fabs((XX+Y*Y)>(Xo)))CirclePoint(X,Y,X0,Y0,Color);
		}
	}
}
Example #4
0
static void
segment_poly(BulkPixelPoint *pt, const PixelPoint center,
             const int radius, const unsigned istart, const unsigned iend,
             unsigned &npoly, const bool forward=true)
{
  assert(istart < ARRAY_SIZE(ISINETABLE));
  assert(iend < ARRAY_SIZE(ISINETABLE));

  // add start node
  pt[npoly++] = CirclePoint(center, radius, istart);

  // add intermediate nodes (if any)
  if (forward) {
    const unsigned ilast = istart < iend ? iend : iend + INT_ANGLE_RANGE;
    for (unsigned i = istart + INT_ANGLE_RANGE / 64; i < ilast;
         i += INT_ANGLE_RANGE / 64) {
      const unsigned angle = i & INT_ANGLE_MASK;
      pt[npoly] = CirclePoint(center, radius, angle);

      if (pt[npoly].x != pt[npoly-1].x || pt[npoly].y != pt[npoly-1].y)
        npoly++;
    }
  } else {
    const unsigned ilast = istart > iend ? iend : iend - INT_ANGLE_RANGE;
    for (int i = istart + INT_ANGLE_RANGE / 64; i > (int)ilast;
         i -= INT_ANGLE_RANGE / 64) {
      const unsigned angle = i & INT_ANGLE_MASK;
      pt[npoly] = CirclePoint(center, radius, angle);

      if (pt[npoly].x != pt[npoly-1].x || pt[npoly].y != pt[npoly-1].y)
        npoly++;
    }
  }

  // and end node
  pt[npoly++] = CirclePoint(center, radius, iend);
}
Example #5
0
//*********************************************
void CircleToCircle(double Circle1CenterX,double Circle1CenterY,double Circle1StartX,double Circle1StartY,
					double Circle1EndX,double Circle1EndY,double Circle2CenterX,double Circle2CenterY,
					double Circle2StartX,double Circle2StartY,double Circle2EndX,double Circle2EndY,
					int circular1Mode,int circular2Mode,int UpMode)
{
	double R1,R2;
	double ArcCircle1,ArcCircle2;
	double ArcCircle1Start,ArcCircle2Start;	
	int Circle1_is_point,Circle2_is_point;
	int i1,i2,j;
	int j1,j2;
//**********************************
	R1=sqrt((Circle1StartX-Circle1CenterX)*(Circle1StartX-Circle1CenterX)+(Circle1StartY-Circle1CenterY)*(Circle1StartY-Circle1CenterY));
	R2=sqrt((Circle2StartX-Circle2CenterX)*(Circle2StartX-Circle2CenterX)+(Circle2StartY-Circle2CenterY)*(Circle2StartY-Circle2CenterY));
//**********************************
//判断圆弧是否为点
	if(R1<ZERO)Circle1_is_point=1;
	else Circle1_is_point=0;

	if(R2<ZERO)Circle2_is_point=1;
	else Circle2_is_point=0;
//**********************************
//如果圆弧为点则对应的ArcCircle、ArcCircleStart直接取0
	if(Circle1_is_point)
	{
		ArcCircle1=0.0;
		ArcCircle1Start=0.0;
	}
	else
	{
		ArcCircle1=calculateArc(Circle1CenterX,Circle1CenterY,Circle1StartX,Circle1StartY,Circle1EndX,Circle1EndY,circular1Mode);
		ArcCircle1Start=calculateLineArc(Circle1StartX-Circle1CenterX,Circle1StartY-Circle1CenterY);
	}

	if(Circle2_is_point)
	{
		ArcCircle2=0.0;
		ArcCircle2Start=0.0;
	}
	else
	{
		ArcCircle2=calculateArc(Circle2CenterX,Circle2CenterY,Circle2StartX,Circle2StartY,Circle2EndX,Circle2EndY,circular2Mode);
		ArcCircle2Start=calculateLineArc(Circle2StartX-Circle2CenterX,Circle2StartY-Circle2CenterY);
	}
//**********************************
//如果圆弧为点则不进行密化
	if(Circle1_is_point)i1=-1;
	else i1=calculateCircleMode(R1,ArcCircle1);
	if(Circle2_is_point)i2=-1;
	else i2=calculateCircleMode(R2,ArcCircle2);	
//**********************************
//存在圆弧为点情况,按点对圆弧进行密化绘图
	if(Circle1_is_point||Circle2_is_point)
	{
		if(i1==0)
		{
			j=calculateNumber;
		}
		else if(i1==1)
		{
			if(minLength>=2*R1||asin(minLength/(2*R1))>ArcCircle1/2)
			{
				j=1;
			}
			else
			{
				j=asin(minLength/(2*R1))/(ArcCircle1/2);
			}
		}
		else if(i1==2)
		{
			j=asin(maxLength/(2*R1))/(ArcCircle1/2);
		}
		else if(i2==0)
		{
			j=calculateNumber;
		}
		else if(i2==1)
		{
			if(minLength>=2*R2||asin(minLength/(2*R2))>ArcCircle2/2)
			{
				j=1;
			}
			else
			{
				j=asin(minLength/(2*R2))/(ArcCircle2/2);
			}
		}
		else if(i2==2)
		{
			j=asin(maxLength/(2*R2))/(ArcCircle2/2);
		}

		if(Circle1_is_point)CirclePoint(ArcCircle2,j,ArcCircle2Start,R2,circular2Mode,UpMode);
		else if(Circle2_is_point)CirclePoint(ArcCircle1,j,ArcCircle1Start,R1,circular1Mode,UpMode);
	}
	else
	{
		if(i1==0)
		{
			j1=calculateNumber;
		}
		else if(i1==1)
		{
			if(minLength>=2*R1||asin(minLength/(2*R1))>ArcCircle1/2)
			{
				j1=1;
			}
			else
			{
				j1=asin(minLength/(2*R1))/(ArcCircle1/2);
			}
		}
		else if(i1==2)
		{
			j1=asin(maxLength/(2*R1))/(ArcCircle1/2);
		}
		if(i2==0)
		{
			j2=calculateNumber;
		}
		else if(i2==1)
		{
			if(minLength>=2*R2||asin(minLength/(2*R2))>ArcCircle2/2)
			{
				j2=1;
			}
			else
			{
				j2=asin(minLength/(2*R2))/(ArcCircle2/2);
			}
		}
		else if(i2==2)
		{
			j2=asin(maxLength/(2*R2))/(ArcCircle2/2);
		}
		if(j1<j2)j=j2;
		else j=j1;
		CircleCircle(ArcCircle1,R1,ArcCircle1Start,circular1Mode,ArcCircle2,ArcCircle2Start,R2,circular2Mode,UpMode,j);
	}
}
Example #6
0
gcc_const
static PixelPoint
CirclePoint(PixelPoint p, int radius, unsigned angle)
{
  return p + CirclePoint(radius, angle);
}