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); }
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); } }
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); } } }
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); }
//********************************************* 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); } }
gcc_const static PixelPoint CirclePoint(PixelPoint p, int radius, unsigned angle) { return p + CirclePoint(radius, angle); }