正负画圆

设要显示圆的圆心在原点(0,0),半径为R,初始点的坐标为(0,R),顺时针生成八分之一圆,令:F(x,y)=x2+y2-R2

则圆的方程为:

F(x,y)=0

当点(x,y)在圆内时,则F(x,y)<0;
当点(x,y)在圆外时,则F(x,y)>0;
当点(x,y)在圆上时,则F(x,y)=0;

假设当前点为Pi(xi,yi),取下一个点Pi+1(xi+1,yi+1)的原则是:

1、当F(xi,yi)≤0时:取xi+1=           xi+1,yi+1= yi。即向走一步,从圆内走向圆外。对应图(a)中的从Pi到Pi+1。
2、当F(xi,yi)>0时:取xi+1=           xi,yi+1= yi-1。即向走一步,从圆外走向圆内。对应图(b)中的从Pi到Pi+1。

由于向圆内或向圆外走取决于F(xi,yi)的正负,因此称为正负法。

下面分两种情况求出F(xi,yi)的递推公式:

(1) 当F(xi,yi)≤0时,向右走,取xi+1=xi+1,yi+1=yi,则

F(xi+1,yi+1)=F(xi+1,yi)

                     =(xi+1)2+yi2-R2
                     =(xi2+yi2-R2)+2xi+1
                     = F(xi,yi)+2xi+1

(2) 当F(xi,yi)>0时,向下走,取xi+1=xi,yi+1=yi-1,则

F(xi+1,yi+1)= F(xi,yi-1)

                   =xi2+(yi-1)2-R2
                   =(xi2+yi2-R2)-2yi+1
                   = F(xi,yi)-2yi+1

初始时,x=0,y=R,故

F(0,R)=(02+R2)-R2=0

通过EasyX实现

#include <graphics.h>
#include <conio.h>

// 正负画圆法
void Circle_PN(int x, int y, int r, int color)
{
	int tx = 0, ty = r, f = 0;

	while(tx <= ty)
	{
		// 利用圆的八分对称性画点
		putpixel(x + tx, y + ty, color);
		putpixel(x + tx, y - ty, color);
		putpixel(x - tx, y + ty, color);
		putpixel(x - tx, y - ty, color);
		putpixel(x + ty, y + tx, color);
		putpixel(x + ty, y - tx, color);
		putpixel(x - ty, y + tx, color);
		putpixel(x - ty, y - tx, color);

		if(f <= 0)
			f = f + 2 * tx + 1, tx++;
		else
			f = f - 2 * ty + 1, ty--;
	}
}

// 主函数
void main()
{
	initgraph(640, 480);
	
	// 测试画圆
	Circle_PN(320, 240, 200, RED);
	Circle_PN(320, 240, 101, RED);
	
	// 按任意键退出
	getch();
	closegraph();
}

结果如下:

参考链接:

https://blog.csdn.net/fbwang2013/article/details/9264965

https://codebus.cn/yangw/a/positive-and-negative-circle-algorithm

发布了109 篇原创文章 · 获赞 179 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44350205/article/details/105666142