图形学_圆的扫描转换

1.中点画圆算法

(1)P为当前点亮象素,那么,下一个点亮的象素可能是P1(Xp+1,Yp)

或P2(Xp +1,Yp +1)。

(2)构造函数:F(X,Y)=X2  +  Y2 -  R2 ;则

F(X,Y)=  0  (X,Y)在圆上;

F(X,Y)< 0   (X,Y)在圆内;

F(X,Y)> 0   (X,Y)在圆外。

设M为P1、P2间的中点,M=(Xp+1,Yp-0.5)

有如下结论:

F(M)< 0  ->M在圆内->  取P1

F(M)>= 0 ->M在圆外-> 取P2

(3)构造判别式

d = F(M)  =  F(xp + 1, yp - 0.5)

=  (xp + 1)2 + (yp - 0.5) 2 - R2

若d<0, 则P1 为下一个象素,那么再下一个象素的判别式为:

d1 = F(xp + 2, yp - 0.5) = (xp + 2)2 + (yp - 0.5) 2 - R2

= d + 2xp +3

即d 的增量为 2xp +3.

若d>=0, 则P2 为下一个象素,那么再下一个象素的判别式为:

d1 = F(xp + 2, yp - 1.5)= (xp + 2)2 + (yp - 1.5) 2 - R2

= d + (2xp + 3)+(-2 yp + 2)

即d 的增量为 2 (xp - yp) +5.

d的初值:d0 = F(1, R-0.5)= 1 + (R-0.5)2 - R2= 1.25 - R


#include "easyx.h"
#include "math.h"
#include "windows.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "graphics.h"

int Draw_yuan(int r,int p1,int p2,int color)
{
int x,y;
double d;
x = p1;
y = p2 + r;
d = 1.25 -r;

putpixel(x,y,color);

while(x <= y)
{
if(d < 0)
{
x = x + 1;
d = (x-p1+1)*(x-p1+1) + (y-p2-0.5)*(y-p2-0.5) - r * r;
}
else
{
x = x + 1;
y = y - 1;
d = (x-p1+1)*(x-p1+1) + (y-p2-0.5)*(y-p2-0.5) - r * r;
}
putpixel(x,y,color);
putpixel(y,x,color);
putpixel(x,2*p2-y,color);
putpixel(y,2*p2-x,color);

putpixel(2*p1-x,y,color);
putpixel(2*p1-y,x,color);
putpixel(2*p1-x,2*p2-y,color);
putpixel(2*p1-y,2*p2-x,color);

}
return 0;
}

int main()
{
//硬件测试,将gd装入图形驱动器,gm置入最大图形模式。
int gd=DETECT,gm,p1,p2,r,color;
printf("绘制圆的中点画圆算法\n");
printf("请输入半径:");
scanf("%d",&r);
printf("请输入圆心坐标:");
scanf("%d%d",&p1,&p2);
printf("请输入颜色:");
scanf("%d",&color);

//图形初始化
initgraph(&gd,&gm,"c:\\tc");
//设置兰背景。
setbkcolor(BLUE);
cleardevice();

Draw_yuan(r,p1,p2,color);

getch();
closegraph();

return 0;
}

2.正负画圆算法

(1)设圆的方程为F(x,y)=X2  +  Y2 -  R2=0;

假设求得Pi的坐标为(xi,yi);

则当Pi在圆内时-> F(xi,yi)<0 -> 向右-> 向圆外

Pi在圆外时-> F(xi,yi)>0 -> 向下-> 向圆内

(2)即求得Pi点后选择下一个象素点Pi+1的规则为:

(3)若F(xi,yi) 已知,计算F(xi+1,yi+1) 可分两种情况

1. F(xi,yi)≤0-> xi+1 = xi+1,yi+1 = yi;

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

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

2. F(xi,yi)>0-> xi+1 = xi,yi+1 = yi -1;

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

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


//正负画圆算法

#include "easyx.h"
#include "math.h"
#include "windows.h"
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "graphics.h"

int Draw_yuan(int r,int p1,int p2,int color)
{
int x0,y0,x,y; //画圆的起始点
x0 = p1;
y0 = p2 + r; //起始点坐标
x = x0;
y = y0;

int F0 = (x0-p1)*(x0-p1) + (y0-p2)*(y0-p2) - r * r;
int F1 = F0;
int F2;

while(x <= y)
{
if(F1 <= 0)
{
x = x + 1;
F2 = (x-p1)*(x-p1) + (y-p2)*(y-p2) - r * r;
}
else
{
y = y - 1;
F2 = (x-p1)*(x-p1) + (y-p2)*(y-p2) - r * r;
}
putpixel(x,y,color);
putpixel(y,x,color);
putpixel(x,2*p2-y,color);
putpixel(y,2*p2-x,color);

putpixel(2*p1-x,y,color);
putpixel(2*p1-y,x,color);
putpixel(2*p1-x,2*p2-y,color);
putpixel(2*p1-y,2*p2-x,color);

F1 = F2;
}
return 0;
}

int main()
{
//硬件测试,将gd装入图形驱动器,gm置入最大图形模式。
int gd=DETECT,gm,p1,p2,r,color;
printf("绘制圆的正负画圆算法\n");
printf("请输入半径:");
scanf("%d",&r);
printf("请输入圆心坐标:");
scanf("%d%d",&p1,&p2);
printf("请输入颜色:");
scanf("%d",&color);

//图形初始化
initgraph(&gd,&gm,"c:\\tc");
//设置兰背景。
setbkcolor(BLUE);
cleardevice();

Draw_yuan(r,p1,p2,color);

getch();
closegraph();

return 0;
}

图形学_圆的扫描转换,布布扣,bubuko.com

时间: 2024-10-08 01:22:48

图形学_圆的扫描转换的相关文章

图形学_多边形扫描转换_边界标志算法

边界标志算法 1. 对多边形的每一条边进行扫描转换,即对多边形边界所经过的象素作一个边界标志. 2.填充 对每条与多边形相交的扫描线,按从左到右的顺序,逐个访问该扫描线上的象素. 取一个布尔变量inside来指示当前点的状态,若点在多边形内,则inside为真.若点在多边形外,则inside为假. Inside 的初始值为假,每当当前访问象素为被打上标志的点,就把inside取反.对未打标志的点,inside不变. 1 #include "easyx.h" 2 #include &qu

计算机图形学 圆的扫描转换(2)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40042591 本文通过一个完整的实例,演示圆的扫描转换. 1)创建CP2类 头文件:p2.h // P2.h: interface for the CP2 class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_P2_H__709052D

图形学_二维图形的剪裁_Sutherland-Hodgeman_Cohen—Sutherland

一.Cohen-Sutherland剪裁算法 1.基本思想 对于每条线段P1P2分为三种情况处理: (1)若P1P2完全在窗口内,则显示该线段P1P2. (2)若P1P2明显在窗口外,则丢弃该线段. (3)若线段不满足(1)或(2)的条件,则在交点处把线段分为两段.其中一段完全在窗口外,可弃之.然后对另一段重复上述处理. 为快速判断,采用如下编码方法: 将窗口边线两边沿长,得到九个区域,每一个区域都用一个四位二进制数标识,直线的端点都按其所处区域赋予相应的区域码,用来标识出端点相对于裁剪矩形边界

图形学_画线算法(DDA、Bresenham)

1. DDA算法实现直线绘制(需先安装easyx,百度下载即可) 1 #include "easyx.h" 2 #include "math.h" 3 #include "windows.h" 4 #include "stdio.h" 5 #include "stdlib.h" 6 #include "conio.h" 7 #include "graphics.h"

图形学_椭圆扫描转换_中点椭圆算法

中点椭圆算法 (1)先讨论椭圆弧的上部分 设(Xp,Yp)已确定,则下一待选像素的中点是(Xp+1,Yp-0.5) d1=F(Xp+1,Yp-0.5)= b2(Xp+1)2+a2(Yp-0.5)2-a2b2 根据d1的符号来决定下一像素是取正右方的那个,还是右上方的那个. 若d1<0,中点在椭圆内,取正右方象素,判别式更新为: d1'=F(Xp+2,Yp-0.5)=d1+b2(2Xp+3) d1的增量为b2(2Xp+3) 当d1≥0,中点在椭圆外,取右下方象素,更新判别式: d1'=F(Xp+2

计算机图形学_第一章_绪论

1.彩色CRT显示器:高速的电子束由电子枪发出,经过聚焦系统.加速系统和磁偏转系统就会到达荧光屏的特点位置. 2.从高能态回到低能态能发出荧光 3.要显示 一副稳定的画面,必须不断地发射电子束 4.电子枪由一个加热器,金属阴极,电平控制器组成 5.使用电平控制器来孔子电子束的强弱,当加上正电压时,电子束大量通过,在屏幕上形成较亮的点,负电压->电子束被部分或全部拦截. 6.刷新一次是指电子束从上到下将荧光屏扫描一次. 7.三原色:红,绿 ,蓝 8.液晶介于液体与固体之间的特殊物质,它具有液体的流

10个免费开源的JS音乐播放器插件

音乐播放器在网页设计中有时候会用到,比如一些时尚类.音乐或影视类等项目,但这些 网页播放器 插件比较少见,所以这里为大家整理一个集合,也许会有用到的时候. 下面整理的播放器有些是支持自适应的,如果需要用到微信或手机上,可根据自己需要求,选择对应的网页播放器.  ● Codrops Audio Codrops Audio 界面使用纯CSS编写,支持响应式,可以方便在桌面.平板以及手机设备上使用.界面因为是CSS编写,所以如果懂CSS样式,可以自己设计一个新的样式来修改. 演示&下载 ● Dark

【学习中】Unity&lt;中级篇&gt; Schedule

章节 内容 签到 Unity3D 实战技术第二版视频教程(中级篇) 1.游戏引擎发展史 2.Unity发展史 3.3D图形学与必要组件 4.核心类_GameObject类 5.核心类_MonoBehaviour类_脚本生命周期 6.Unity伪多线程研究实验 7.核心类_Time类 8.场景异步加载与输入管理器讲解 9.贴图类型 10.二维贴图实验 11.立方体贴图 12.视频贴图 13.渲染贴图 14.图形学_材质 15.图形学_着色器 16.Unity编辑器菜单学习 17.物理学模拟_铰链关

计算机图形学 椭圆的扫描转换(3)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40045907 本文通过一个完整的实例,演示椭圆的扫描转换. 1)创建CEllipse类 头文件:Ellipse.h // Ellipse.h: interface for the CEllipse class. // ////////////////////////////////////////////////////////////////////// #if !defi