用C语言怎么画圆呢?
请问谁懂C语言画圆的原理?无穷多边形吗 /********************************************//* 画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/********************************************/
void GUI_circle( unsigned char Ox,unsigned char Oy,unsigned char Rx,unsigned char s )
{
unsigned int xx,rr;
unsigned int xt,yt;
unsigned int rs,row,col;
yt = Rx;
rr = ( unsigned int )Rx*Rx+1; // 补偿1 修正方形
rs = ( yt+( yt>>1 ) )>>1; // (*0.75)分开1/8圆弧来画
for ( xt=0; xt<=rs; xt++ )
{
xx = xt*xt;
while ( ( yt*yt )>( rr-xx ) )
{
yt--;
}
row = Ox+xt; // 第一象限
col = Oy-yt;
LCD_Point( row,col,s );
row = Ox-xt; // 第二象限
LCD_Point( row,col,s );
col = Oy+yt; // 第三象限
LCD_Point( row,col,s );
row = Ox+xt; // 第四象限
LCD_Point( row,col,s );
//***************45度镜象画另一半***************
row = Ox+yt; // 第一象限
col = Oy-xt;
LCD_Point( row,col,s );
row = Ox-yt; // 第二象限
LCD_Point( row,col,s );
col = Oy+xt; // 第三象限
LCD_Point( row,col,s );
row = Ox+yt; // 第四象限
LCD_Point( row,col,s );
}
} 解释几何上不是有园的方程吗? (x-a)^2+(y-b)^2=r^2,圆心O(a,b),半径r。 只有两个未知数,跟画直线的原理一样的。只是需要用到平方,开方,等数学函数库。
有或者看看极坐标上面有没有方便点的办法,或者三角函数什么的 ...
愚见 哪里会无穷多边形?如果显示出来就会被量化成像有限个素点如果不画出来,那就看你需要的精度(太高精度实在没必要) #include <graphics.h>
void main()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"c:\\tc");
cleardevice();
moveto(160,120);
lineto(480,120);
lineto(480,360);
lineto(160,360);
lineto(160,120);
getch();
closegraph();
} 可以看看这个
http://www.ourdev.cn/forum.php?mod=viewthread&tid=5462626&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1 51的麻烦在于需要尽量减少浮点运算,math.h没有十足必要真的别引进来…… X=Rcos(A)+X0
Y=Rsin(A)+Y0
A从0到6.28
然后画点 y574924080 发表于 2012-3-29 19:37 static/image/common/back.gif
可以看看这个
http://www.ourdev.cn/forum.php?mod=viewthread&tid=5462626&extra=page%3D1%26filter%3Ddi ...
谢谢,这个贴总结的很多啊! 51yyaayya 发表于 2012-3-30 13:55 static/image/common/back.gif
谢谢,这个贴总结的很多啊!
不用,
大家互帮互助~~~~~~~ 本帖最后由 cqv 于 2012-3-30 19:22 编辑
当年不知道从那抄的。。void LCD_Circle (unsigned int x, unsigned int y, unsigned int r, unsigned int color)
{
int a, b;
int di;
a = 0;
b = r;
di = 3 - 2 * r; //判断下个点位置的标志
while (a <= b)
{
LCD_Point (x - b, y - a, color); //3
LCD_Point (x + b, y - a, color); //0
LCD_Point (x - a, y + b, color); //1
LCD_Point (x - b, y - a, color); //7
LCD_Point (x - a, y - b, color); //2
LCD_Point (x + b, y + a, color); //4
LCD_Point (x + a, y - b, color); //5
LCD_Point (x + a, y + b, color); //6
LCD_Point (x - b, y + a, color);
a++;
/***使用Bresenham算法画圆**/
if (di < 0)
di += 4 * a + 6;
else
{
di += 10 + 4 * (a - b);
b--;
}
LCD_Point (x + a, y + b, color);
}
} 我用的这个void LCD_DrawFullCircle(rt_uint16_t Xpos, rt_uint16_t Ypos, rt_uint16_t Radius, rt_uint16_t Circle_colour, rt_uint16_t full_or_not)
{
int32_tD; /* Decision Variable */
uint32_tCurX;/* Current X Value */
uint32_tCurY;/* Current Y Value */
D = 3 - (Radius << 1);
CurX = 0;
CurY = Radius;
D = 3 - (Radius << 1);
CurX = 0;
CurY = Radius;
while (CurX <= CurY)
{
if(full_or_not!=0)
{
LCD_DrawLine_HORIZONTAL(Xpos - CurX, Ypos + CurY, 2*CurX, Circle_colour);
LCD_DrawLine_HORIZONTAL(Xpos - CurX, Ypos - CurY, 2*CurX, Circle_colour);
LCD_DrawLine_HORIZONTAL(Xpos - CurY, Ypos + CurX, 2*CurY, Circle_colour);
LCD_DrawLine_HORIZONTAL(Xpos - CurY, Ypos - CurX, 2*CurY, Circle_colour);
}
else
{
DrawPixel(Xpos + CurX, Ypos + CurY, Circle_colour);
DrawPixel(Xpos + CurX, Ypos - CurY, Circle_colour);
DrawPixel(Xpos - CurX, Ypos + CurY, Circle_colour);
DrawPixel(Xpos - CurX, Ypos - CurY, Circle_colour);
DrawPixel(Xpos + CurY, Ypos + CurX, Circle_colour);
DrawPixel(Xpos + CurY, Ypos - CurX, Circle_colour);
DrawPixel(Xpos - CurY, Ypos + CurX, Circle_colour);
DrawPixel(Xpos - CurY, Ypos - CurX, Circle_colour);
}
if (D < 0)
{
D += (CurX << 2) + 6;
}
else
{
D += ((CurX - CurY) << 2) + 10;
CurY--;
}
CurX++;
}
}
有个算法来着,br什么,一时忘记了 cqv 发表于 2012-3-30 19:18 static/image/common/back.gif
当年不知道从那抄的。。
你这个程序的原理是什么?看不明白啊!while(a<=b)这个语句一开始不就是真值吗?为什么要这样比较?还有后面的:
/***使用Bresenham算法画圆**/
if(di<0)di +=4*a+6;
else
{
di+=10+4*(a-b);
b--;
}
这样做的原理是为什么? http://www.ourdev.cn/forum.php?m ... st%3D1%26digest%3D1 tdjsppwct 发表于 2012-4-18 17:21 static/image/common/back.gif
你这个程序的原理是什么?看不明白啊!while(a
使用Bresenham算法画圆
我这不是标注了吗。。。{:sweat:} 本帖最后由 tdjsppwct 于 2012-4-19 22:22 编辑
cqv 发表于 2012-4-19 20:29 static/image/common/back.gif
使用Bresenham算法画圆
我这不是标注了吗。。。
di = 3 - 2 * r; //判断下个点位置的标志
为什么要对di这样赋值?这个判断下一个点的原理是怎么判断的?没有懂
还有:if(di<0) di +=4*a+6;
else di+=10+4*(a-b);
这个判断里面为什么di的值是这样计算的,实在不懂!查了下该算法,可是还是没有搞懂!望指点迷津,谢谢! tdjsppwct 发表于 2012-4-19 22:17 static/image/common/back.gif
di = 3 - 2 * r; //判断下个点位置的标志
为什么要对di这样赋值?这个判断下一个点的原理是怎么判断的 ...
。。我也没深入过,我也是就拿来用。
你真要研究,去研究“计算机图形学”吧。 void disp_circle(uchar a,uchar b,uchar r,uint o)
{ //a,b:圆心坐标r:半径 o:圆心角
uchar x,y; //x,y:圆上坐标
x=(uchar)(a-r*cos((double)(o*rad)));
y=(uchar)(b-r*sin((double)(o*rad)));
disp_dot(x,y);
}
void disp_dot(uchar hang,uchar lie)//hang:行(0~63)
{ //lie: 列(0~127)
uchar col,page; //col: 选择dot表中字形
page=hang/8; //page:判断属于哪一页
col=hang%8;
set_page_address(7-page);
set_col_address(lie);
w_data(dot);
} cqv 发表于 2012-4-20 18:32 static/image/common/back.gif
。。我也没深入过,我也是就拿来用。
你真要研究,去研究“计算机图形学”吧。 ...
谢谢,我慢慢研究吧 tdjsppwct 发表于 2012-4-21 07:38 static/image/common/back.gif
谢谢,我慢慢研究吧
研究的咋样阿?我也想知道为什么阿 Ytu-xiaolizig 发表于 2012-8-10 17:12 static/image/common/back.gif
研究的咋样阿?我也想知道为什么阿
{:cry:} 一大堆烂事挤在一起了,哪有时间研究啊! 好帖子,以后能用到,MARK下,画圆函数讨论{:lol:} 这段时间由于开始上班了,回来都比较累。都没什么多余的精力去学习了。不过很是多谢大家的帮助 谢谢分享!! 学习了,试验成功!画的圆很圆! 受教了,
页:
[1]