高速扇形绘制程序

来源:互联网 发布:最好的股票行情软件 编辑:程序博客网 时间:2024/06/11 01:37

程序:罗健军


  程序中var16为有符号16位数字型,uvar16为无符号16位数字型。var32为有符号32位数字型。PutPixel为画点函数。

  函数Sector入口参数x0,y0为圆心坐标,r为半径。stangle为起始角度,endangle为结束角度。

double SIN45=0.707106781186548;uvar32 SINV[91]={0,     17452406,   34899496,   52335956,   69756473,   87155742,  104528463,    121869343,  139173100,  156434465,  173648177,  190808995,  207911690,    224951054,  241921895,  258819045,  275637355,  292371704,  309016994,    325568154,  342020143,  358367949,  374606593,  390731128,  406736643,    422618261,  438371146,  453990499,  469471562,  484809620,  500000000,    515038074,  529919264,  544639035,  559192903,  573576436,  587785252,    601815023,  615661475,  629320391,  642787609,  656059028,  669130606,    681998360,  694658370,  707106781,  719339800,  731353701,  743144825,    754709580,  766044443,  777145961,  788010753,  798635510,  809016994,    819152044,  829037572,  838670567,  848048096,  857167300,  866025403,    874619707,  882947592,  891006524,  898794046,  906307787,  913545457,    920504853,  927183854,  933580426,  939692620,  945518575,  951056516,    956304755,  961261695,  965925826,  970295726,  974370064,  978147600,    981627183,  984807753,  987688340,  990268068,  992546151,  994521895,    996194698,  997564050,  998629534,  999390827,  999847695,  1000000000};
/////////////////////////////////////////////////////////////////////////////////// 查找表式sin函数/////////////////////////////////////////////////////////////////////////////////double Lsin(var16 angle){ double v,f;
 if(angle>360||angle<-360)angle=angle-(angle/360)*360; if(angle<0)angle=360+angle; if(angle>180)f=-1;else f=1; if(angle>90&&angle<=180)angle=180-angle;  else if(angle>180&&angle<=270)angle=angle-180;   else if(angle>270)angle=360-angle;
 v=f*SINV[angle]/10.0e8; return(v);}
/////////////////////////////////////////////////////////////////////////////////// 查找表式cos函数/////////////////////////////////////////////////////////////////////////////////double Lcos(var16 angle){ double v,f;
 if(angle>360||angle<-360)angle=angle-(angle/360)*360; if(angle<0)angle=360+angle; if(angle<270&&angle>90)f=-1;else f=1; if(angle>90&&angle<=180)angle=180-angle; else if(angle>180&&angle<=270)angle=angle-180;  else if(angle>270)angle=360-angle;
 angle=90-angle; v=f*SINV[angle]/10.0e8;
 return(v);}
/////////////////////////////////////////////////////////////////////////////////// 扇形绘制函数////////////////////////////////////////////////////////////////////////////////void Sector(var16 x0,var16 y0,uvar16 r,uvar16 stangle,uvar16 endangle){ var16 i,j; var16 *xy; var16 bx,ex,bxd,exd,bxf,exf,ben; var32 tn,x,y; var32 xmax;
 y=r; x=0; xmax=(var32)(r*SIN45); tn=(1-r*2);
 xy=(var16 *)calloc(20,sizeof(var16)); xy[ 0]=x0+r;xy[1]=y0; xy[ 2]=x0;  xy[3]=y0-r; xy[ 4]=x0;  xy[5]=y0-r; xy[ 6]=x0-r;xy[7]=y0; xy[ 8]=x0-r;xy[9]=y0; xy[10]=x0;  xy[11]=y0+r; xy[12]=x0;  xy[13]=y0+r; xy[14]=x0+r;xy[15]=y0;
 bx=stangle/45; ex=endangle/45; ben=ex-bx-1;
 xy[16]=(var16)(r*Lcos(stangle)); xy[17]=(var16)(r*Lsin(stangle)); xy[18]=(var16)(r*Lcos(endangle)); xy[19]=(var16)(r*Lsin(endangle));
 Line(x0+xy[16],y0-xy[17],x0,y0); Line(x0+xy[18],y0-xy[19],x0,y0);
 if(bx==1||bx==2||bx==5||bx==6)bxd=abs(xy[16]);else bxd=abs(xy[17]); if(ex==1||ex==2||ex==5||ex==6)exd=abs(xy[18]);else exd=abs(xy[19]); if(bx==0||bx==2||bx==4||bx==6)bxf=0;          else bxf=1; if(ex==0||ex==2||ex==4||ex==6)exf=1;          else exf=0;
 while(x<=xmax) {  if(tn>=0)  {   tn+=(6+((x-y)*4));   y--;   xy[0]--;   xy[3]++;   xy[5]++;   xy[6]++;   xy[8]++;   xy[11]--;   xy[13]--;   xy[14]--;  }  else tn+=((x*4)+2);
  if(stangle<endangle)  {   j=(bx+1)*2;   for(i=0;i<ben;i++)   {    PutPixel(xy[j],xy[j+1]);    j+=2;   }  }  else if(stangle>endangle)  {   j=(bx+1)*2;   for(i=bx+1;i<8;i++)   {    PutPixel(xy[j],xy[j+1]);    j+=2;   }   j=0;   for(i=0;i<ex;i++)   {    PutPixel(xy[j],xy[j+1]);    j+=2;   }  }
  i=bx*2;  if( (x>bxd)^bxf )PutPixel(xy[i],xy[i+1]);i=ex*2;  if( (x>exd)^exf )PutPixel(xy[i],xy[i+1]);x++;  xy[ 1]--;  xy[ 2]++;  xy[ 4]--;  xy[ 7]--;  xy[ 9]++;  xy[10]--;  xy[12]++;  xy[15]++; } free(xy);}