海哑 发表于 2007-9-25 09:08

[求助] 用C语言如何实现 (用中点算法和Bresenham算法) 画圆.-->雨中飞燕转移

用C语言如何实现 (用中点算法和Bresenham算法) 画圆. 

海哑 发表于 2007-9-25 09:20

回复:(海哑)[求助] 用C语言如何实现 (用中点算...

<P>#include&lt;stdio.h&gt;<BR>#include&lt;graphics.h&gt;<BR>void MidPointCircle(int r,int color);<BR>void CirclePoints(int x,int y,int color);<BR>void main()<BR>{<BR>      int  gdriver=DETECT, gmode;</P>
<P>      initgraph(&amp;gdriver, &amp;gmode," ");<BR>      setbkcolor(BLACK);<BR>      MidPointCircle(100,BLUE);            /*下次画圆半径大点,你给的半径真夸张*/<BR>      getch();<BR>      closegraph();<BR>}</P>
<P>void MidPointCircle(int r,int color)<BR>{<BR>      int x,y;<BR>      float d;</P>
<P>      x=0;<BR>      y=r;<BR>      d=1.25-r;<BR>      CirclePoints(x,y,color);<BR>      while(x&lt;y)<BR>        {<BR>          if(d&lt;0)<BR>                d+=2*x+3;<BR>          else<BR>            {<BR>                d+=2*(x-y)+5;<BR>                y--;<BR>            }<BR>          x++;<BR>          CirclePoints(x,y,color);        /*重点是这里*/<BR>        }<BR>}</P>
<P>void CirclePoints(int x,int y,int color) /*圆心为(320,240)*/<BR>{<BR>      putpixel(320+x,240+y,color);<BR>      putpixel(320+y,240+x,color);<BR>      putpixel(320-x,240+y,color);<BR>      putpixel(320+y,240-x,color);<BR>      putpixel(320+x,240-y,color);<BR>      putpixel(320-y,240+x,color);<BR>      putpixel(320-x,240-y,color);<BR>      putpixel(320-y,240-x,color);<BR>}<BR></P>

neverTheSame 发表于 2007-9-25 13:05

中点算法:<BR>void MidpointLine(int x0,int y0,int x1,int y1,int color)<BR>{<BR> int x,y,mid,dx,dy,d_up,d_down;<BR> if(x0&gt;x1)<BR> {<BR>  x=x0;<BR>  x0=x1;<BR>  x1=x;<BR>  y=y0;<BR>  y0=y1;<BR>  y1=y;<BR> }<BR> dy=y1-y0;dx=x1-x0;<BR> mid=dx-2*dy;<BR> d_up=2*dx-2*dy;d_down=-2*dy;<BR> x=x0;y=y0;<BR> while(x&lt;=x1)<BR> {<BR>  putpixel(x,y,color);<BR>  x++;<BR>  if(mid&lt;0)<BR>  {<BR>   y++;<BR>   mid=mid+d_up;<BR>  }<BR>  else<BR>   mid=mid+d_down;<BR> }<BR> return ;<BR>}<BR>

neverTheSame 发表于 2007-9-25 13:06

<P>数值微分法:<BR>int DDALine (int x0,int y0,int x1,int y1,int color)<BR>{<BR> int coordinate;<BR> float dx=x1-x0/*X方向的增量*/,<BR>    dy=y1-y0/*Y方向的增量*/;<BR> float eXY;<BR> float coorXY;<BR> if(dx==0)     /*X方向的增量为0*/<BR> {<BR>  coorXY=x0;<BR>  if(dy&gt;=0) /*Y方向的增量为正方向*/<BR>  {<BR>   for(coordinate=y0;coordinate&lt;=y1;coordinate++)<BR>    putpixel(coorXY,coordinate,color);<BR>  }<BR>  else      /*Y方向的增量为负方向*/<BR>  {<BR>   for(coordinate=y0;coordinate&gt;=y1;coordinate--)<BR>    putpixel(coorXY,coordinate,color);<BR>  }<BR> }<BR> else if(dy/dx&lt;=1 &amp;&amp; dy/dx&gt;=-1)  /*|dy/dx|&lt;=1*/<BR> {<BR>    /*X方向的增量为+1/-1,Y方向随之增量为+eXY/-eXY*/</P>
<P>  coorXY=y0;      /*Y方向的初始值为y0*/<BR>  if(dx&gt;=0)<BR>  {<BR>   eXY=dy/dx;  /*当dy&gt;=0时,eXY=dy/dx&gt;=0,<BR>                 当dy&lt;0 时,eXY=dy/dx&lt;0*/<BR>   for(coordinate=x0;coordinate&lt;=x1;coordinate++)<BR>   {<BR>    putpixel(coordinate,(int)(coorXY),color);<BR>    coorXY+=eXY; /*Y方向增量为eXY*/<BR>   }<BR>  }<BR>  else<BR>  {<BR>   eXY=-dy/dx;  /*当dy&gt;=0时,eXY=-dy/dx&gt;=0,<BR>                  当dy&lt;0 时,eXY=-dy/dx&lt;0*/<BR>   for(coordinate=x0;coordinate&gt;=x1;coordinate--)<BR>   {<BR>    putpixel(coordinate,(int)(coorXY),color);<BR>    coorXY+=eXY;  /*Y方向增量为eXY*/<BR>   }<BR>  }<BR> }<BR> else                      /*|dy/dx|&gt;1*/<BR> {<BR>  coorXY=x0;            /*X方向的初始值为y0*/<BR>  if(dy&gt;=0)<BR>  {<BR>   eXY=dx/dy;        /*当dx&gt;=0时,eXY=dx/dy&gt;=0,<BR>                       当dx&lt; 0时,eXY=dx/dy&lt;0*/<BR>   for(coordinate=y0;coordinate&lt;=y1;coordinate++)<BR>   {<BR>    putpixel((int)(coorXY),coordinate,color);<BR>    coorXY+=eXY;  /*X方向增量为eXY*/<BR>   }<BR>  }<BR>  else<BR>  {<BR>   eXY=-dx/dy;       /*当dx&gt;=0时,eXY=-dx/dy&gt;=0,<BR>                       当dx&lt; 0时,eXY=-dx/dy&lt;0*/<BR>   for(coordinate=y0;coordinate&gt;=y1;coordinate--)<BR>   {<BR>    putpixel((int)(coorXY),coordinate,color);<BR>    coorXY+=eXY;  /*X方向增量为eXY*/<BR>   }<BR>  }<BR> }<BR> return 0;                 /*返回值为0*/<BR>}</P>

页: [1]

编程论坛