关闭

高速椭圆绘制程序

805人阅读 评论(0) 收藏 举报
分类:

程序:罗健军


  程序中var16为有符号16位数字型,uvar1616位无符号数字型,uvar32为无符号32位数字型,var32为有符号32位数字型。Ellipse参数中的x0,y0为圆心坐标,r1r2分别为横半径和纵半径。PutPixel为画点函数。

void Ellipse(var16 x0,var16 y0,uvar16 r1,uvar16 r2)
{
 uvar32 r,r12,r22;
 var16 x,y,xmax;
 var32 tn;
 x=0;y=r2;
 r12=r1*r1;r22=r2*r2;
 xmax=var16(r12/sqrt(r12+r22));
 tn=r12-2*r2*r12; 
 while(x<=xmax)
 {
  if(tn<0||y==0)tn+=(4*x+2)*r22;
   else
   {
    tn+=(4*x+2)*r22+(1-y)*4*r12;
    y--;
   }   
  PutPixel(x0+x,y0+y);
  PutPixel(x0-x,y0+y);
  PutPixel(x0+x,y0-y);
  PutPixel(x0-x,y0-y);
  x++;
 }
 PutPixel(x0+x,y0+y);
 PutPixel(x0-x,y0+y);
 PutPixel(x0+x,y0-y);
 PutPixel(x0-x,y0-y);
 r=r1;r1=r2;
 r2=(uvar16)r;
 x=0;y=r2;
 r12=r1*r1;r22=r2*r2;
 xmax=var16(r12/sqrt(r12+r22));
 tn=r12-2*r2*r12; 
 while(x<=xmax)
 {
  if(tn<0||y==0)tn+=(4*x+2)*r22;
   else
   {
    tn+=(4*x+2)*r22+(1-y)*4*r12;
    y--;
   }   
  PutPixel(x0+y,y0+x);
  PutPixel(x0+y,y0-x);
  PutPixel(x0-y,y0+x);
  PutPixel(x0-y,y0-x);
  x++;
 } 
 PutPixel(x0+y,y0+x);
 PutPixel(x0+y,y0-x);
 PutPixel(x0-y,y0+x);
 PutPixel(x0-y,y0-x);
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:46766次
    • 积分:803
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:7篇
    • 译文:0篇
    • 评论:18条
    最新评论
    游戏开发
    游戏引擎