孤行的浪子 发表于 2007-10-22 20:08

求助! bresenham画椭圆

<P>我编了一个用bresenham算法画椭圆的小程序,结果发现不太好使 那位高手指点一下   谢谢!<BR>程序如下:<BR><BR>#include "stdio.h"<BR>#include &lt;graphics.h&gt;<BR>#define closegr closegraph<BR>#include &lt;conio.h&gt;<BR>void circlepoint(int j,int k,int pointX,int pointY)<BR>{<BR>  putpixel(pointX,pointY,WHITE);<BR>  putpixel(j+pointX,k+pointY,RED);<BR>  putpixel(-j+pointX,k+pointY,YELLOW);<BR>  putpixel(-j+pointX,-k+pointY,GREEN);<BR>  putpixel(j+pointX,-k+pointY,BLUE);<BR>  }<BR>void Midbresenhamellipse(int a,int b,int aR,int bR )<BR>{<BR>  if(aR&lt;bR)<BR>  {<BR>   int x,y;<BR>    float d1,d2;<BR>     x=0;<BR>     y=bR;<BR>     d1=bR*bR+aR*aR*(-bR+0.25);<BR>      circlepoint(x,y,a,b);<BR>  while(bR*bR*(x+1)&lt;aR*aR*(y-0.5))<BR>   {<BR>    if(d1&lt;=0)<BR>     {<BR>       d1+=bR*bR*(2*x+3);<BR>        x++;<BR>     }<BR>     else<BR>    {<BR>     d1+=bR*bR*(2*x+3)+aR*aR*(-2*y+2);<BR>     x++;<BR>     y--;<BR>    }<BR>    circlepoint(x,y,a,b);<BR>   }<BR>d2=bR*bR*(x+0.5)*(x+0.5)+aR*aR*(y-1)*(y-1)-aR*aR*bR*bR;<BR> while(y&gt;0)<BR> {<BR>   if(d2&lt;=0)<BR>    {<BR>     d2+=bR*bR*(2*x+2)+aR*aR*(-2*y+3);<BR>     x++;<BR>     y--;<BR>    }<BR>   else<BR>   {<BR>    d2+=aR*aR*(-2*y+3);<BR>    y--;<BR>    }<BR>   circlepoint(x,y,a,b);<BR>   }<BR> }<BR> else         /*横向放置圆*/<BR>  {<BR>   int X,Y;<BR>   float d3,d4;<BR>   X=0;<BR>   Y=bR;<BR>  d3=0.25*bR*bR+aR*aR*(-2*bR+1);<BR> circlepoint(X,Y,a,b);<BR>while(bR*bR*(X+0.5)&gt;aR*aR*(Y-1))<BR>  {<BR>  if(d3&gt;=0)<BR>   {<BR>   d3+=aR*aR*(-2*Y+3);<BR>   Y--;<BR>   }<BR>   else {<BR>   d3+=aR*aR*(-2*Y+3)+bR*bR*(2*X+2);<BR>   X++;<BR>   Y--;<BR>   }<BR>  circlepoint(X,Y,a,b);<BR>  }<BR>d4=bR*bR*(X+1)*(X+1)+aR*aR*(Y-0.5)*(Y-0.5)-aR*aR*bR*bR;<BR> while(Y&gt;=0)<BR>  {<BR>    if(d4&lt;0)<BR>      {<BR>       d4+=bR*bR*(2*X+3);<BR>       X++;<BR>      }<BR>   else<BR>      {<BR>      d4+=bR*bR(2*X+3)+aR*aR(2-2*Y);<BR>      X++;<BR>      Y--;<BR>      }<BR>   circlepoint(X,Y,a,b);<BR>     }<BR>   }<BR> }<BR> int main(void)<BR>{ int j,k,longR,shortR;<BR>  int gdriver,gmode;<BR>  detectgraph(&amp;gdriver,&amp;gmode);<BR>  initgraph(&amp;gdriver,&amp;gmode,"");<BR>  printf("\nEnter the center of circle :");<BR>  scanf("%d,%d",&amp;j,&amp;k);<BR>  printf("Enter long and short radius:");<BR>  scanf("%d,%d",&amp;longR,&amp;shortR);<BR>  Midbresenhamellipse(j,k,longR,shortR);<BR>  getch();<BR>  closegr();<BR>  return 0;<BR>}</P>
<P><BR></P>

jig 发表于 2007-11-2 12:48

是不能画圆,还是嫌圆的效果不好?<br><br>要是只是效果不好,那没办法此法的优点就是画圆快速,一般在嵌入式直接使用此法,不过画出的圆的确不够圆滑
[align=right][color=#000066][此贴子已经被作者于2007-11-2 12:52:44编辑过][/color][/align]

eakcon 发表于 2007-11-14 10:04

太有味了<BR>

页: [1]

编程论坛