计算机图形学第三章.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
X方向移动 是
开始
偏差判别
Y方向移动
终点判别
否
结束
偏差计算
圆弧的逐点插补法(1/15)
圆弧的生成按圆弧所在的象限以及画弧 方向(逆时针还是顺时针)进行。若圆弧跨过 几个象限,应按象限分段生成。我们讨论问 题还是从最简单形式开始,最后再推广到所 有象限中去。 若画第一象限的圆弧AB,如下图3-1 所示,起点为A(xa, ya), 终点为B(xb, yb),圆心为O(0,0),设绘图笔当前位置为 K(xk, yk),这里的坐标为局部坐标。
(
(
(
Fk x y R
2 k 2 k
(
2
R是为便于推导引入的半径。
当K在AB上时,Fk=0; K在AB外侧时,Fk>0; K在AB内侧时,Fk<0。
圆弧的逐点插补法(4/15)
对第一象限的圆弧逆时针方向生成时,规定如下: 当Fk≥0时,绘图笔从当前位置沿-X方向走一步,记作Δx; 当Fk<0时,绘图笔从当前位置沿+Y方向走一步,记作 +Δy。 绘图笔走-Δx时,新点坐标为 xk+1=xk-1, 新点偏差为 yk+1=yk
第三章 二次曲线
第二章中介绍了绘制直线的几 种算法,还有对不同线型的处理, 现实应用中为了表示出丰富的图形 图像,仅有直线是不够的,常用的 二次曲线如圆,抛物线,椭圆,双 曲线等。本章主要讨论生成二次曲 线的不同方法,重点在于如何绘制 圆。
第三章 二次曲线
1. 2. 3. 4.
5.
2 k 1 2 k 2 k
新点偏差为
Fk 1 x
y
2 k
2 k 1
R
2 2
2 2
x ( yk 1) R Fk 2 yk 1
x y R 2 yk 1
圆弧的逐点插补法(7/15)
新点偏差Fk+1由当前点的坐标值及偏差来计 算。根据Fk+1的正、负号再确定绘图笔的下一步 走向,这样逐步进行,直到绘图笔到达圆弧的 终点为止。终点判断可由总走步数J(J=|xbxa|+|yb-ya|)来控制。每走一步J减去1,当J=0 时即到达终点。下面以一个例子说明。
圆弧的逐点插补法(13/15)
逐点画圆的原始代码程序
void CDddView::OnCircle1() {
//注意这个函数的参数为空,这个程序要能正常 运行要 注意把pDC和rect二个变量作为CDddView类的成员变量 //程序绘图接口
pDC=GetDC(); GetClientRect(rect); int xc=200,yc=200; //圆心 float r=100.3; //半径 int x=int(r+0.5); //起始点x坐标 int y=0; //起始点y坐标
Y B 6 5 4 2 3 1 A
O
X
图3-2
逐点比较法绘制圆弧实例
圆弧的逐点插补法(10/15)
思考:圆在现实生活中应用广泛,以优美, 对称的规则形状让很多人喜爱。太阳,月亮 是圆的,给了诗人们多少浪漫的幻想,留下 了多少传世诗篇,我们说圆了我们的梦想, 这个圆就有另一层含义了。绘制圆这个最简 单的二次曲线当然是我们图形学中的重要问 题。绘制圆的算法很多,这个在第三节我们 再介绍。根据圆的对称这个特点,我们在绘 制圆的过程中很简单,只要找到圆周的八分 之一圆弧的点,就可以通过对称性找到圆周 的所有点,如下图所示:
圆弧的逐点插补法(8/15)
例 用逐点比较法逆时针画圆弧AB,设起点为 A(4,3), 终点为B(0,5),圆心为O(0,0)。 算法生成圆弧从起点开始,总走步数 J=|0-4|+|5-3|=6,起点处F0=0,走步方向的规定 按第一象限进行。算法的计算过程列于下表,其 结果如图3-2所示。
圆弧的逐点插补法(9/15)
圆弧的逐点插补法(11/15)
圆周的八对称性质
(-y,x)
(y,x)
(-x,y)
(x,y)
O (-x,-y) (x,-y)
假设圆心在原点 x2+y2=R2
(-y,-x)
(y,-x)
圆弧的逐点插补法(12/15)
在计算机屏幕中绘制圆,圆心一般不
在坐标为(0,0)的位置,假设要绘制的 圆心在(XC,YC),那么来个坐标转换就 可以解决问题了,比如上面图形中的 圆上相对于圆心(0,0)任一点坐标 (x,y),转换到屏幕中以(XC,YC)为圆心 的圆,则实际坐标变为(XC+x, YC+y)。 这样在绘制的过程中我们只要加一个 实际圆心坐标就好了。
圆弧的逐点插补法 (14/15) //停止条件
while(x>=y) { pDC->SetPixel(xc+x,yc+y,color); pDC->SetPixel(xc+y,yc+x,color); pDC->SetPixel(xc-y,yc+x,color); pDC->SetPixel(xc-x,yc+y,color); pDC->SetPixel(xc-x,yc-y,color); pDC->SetPixel(xc-y,yc-x,color); pDC->SetPixel(xc+y,yc-x,color); pDC->SetPixel(xc+x,yc-y,color); //注意这个color也属于类的成员变量
圆弧的逐点插补法(2/15)
Y B(xb , yb ) K (xk , yk)
R
A(xa , ya )
O
X
图3-1
逐点比较法与圆弧的生成
圆弧的逐点插补法(3/15)
点K相对于圆弧AB的位置有三种情况:点K在AB外侧,点K 在AB上以及点K在AB内侧。为判断点K与 AB的相对位置,引入 偏差函数Fk,
圆弧的逐点插补法(5/15)
Fk 1 x
2 k 1
y
Biblioteka Baidu
2 k 1
R
2 k
2
( xk 1) y R
2 2 k 2 k 2
2
x y R 2 xk 1 Fk 2 xk 1
圆弧的逐点插补法(6/15)
绘图笔走+Δy时,新点坐标为
xk 1 xk , yk 1 yk 1
圆弧的逐点插补法 圆弧的Bresenham算法 绘制圆弧的其它几种方法 椭圆的生成算法 其它二次曲线绘制举例
3.1圆弧的逐点插补法
圆弧逐点插补法算法的基本思想是:在绘制 圆弧的过程中,每绘制一个点就与圆弧进行 比较,根据比较的结果决定下一步的走向, 这样一步一步逼近圆弧,逐点比较法的执行 过程如下:
开始
偏差判别
Y方向移动
终点判别
否
结束
偏差计算
圆弧的逐点插补法(1/15)
圆弧的生成按圆弧所在的象限以及画弧 方向(逆时针还是顺时针)进行。若圆弧跨过 几个象限,应按象限分段生成。我们讨论问 题还是从最简单形式开始,最后再推广到所 有象限中去。 若画第一象限的圆弧AB,如下图3-1 所示,起点为A(xa, ya), 终点为B(xb, yb),圆心为O(0,0),设绘图笔当前位置为 K(xk, yk),这里的坐标为局部坐标。
(
(
(
Fk x y R
2 k 2 k
(
2
R是为便于推导引入的半径。
当K在AB上时,Fk=0; K在AB外侧时,Fk>0; K在AB内侧时,Fk<0。
圆弧的逐点插补法(4/15)
对第一象限的圆弧逆时针方向生成时,规定如下: 当Fk≥0时,绘图笔从当前位置沿-X方向走一步,记作Δx; 当Fk<0时,绘图笔从当前位置沿+Y方向走一步,记作 +Δy。 绘图笔走-Δx时,新点坐标为 xk+1=xk-1, 新点偏差为 yk+1=yk
第三章 二次曲线
第二章中介绍了绘制直线的几 种算法,还有对不同线型的处理, 现实应用中为了表示出丰富的图形 图像,仅有直线是不够的,常用的 二次曲线如圆,抛物线,椭圆,双 曲线等。本章主要讨论生成二次曲 线的不同方法,重点在于如何绘制 圆。
第三章 二次曲线
1. 2. 3. 4.
5.
2 k 1 2 k 2 k
新点偏差为
Fk 1 x
y
2 k
2 k 1
R
2 2
2 2
x ( yk 1) R Fk 2 yk 1
x y R 2 yk 1
圆弧的逐点插补法(7/15)
新点偏差Fk+1由当前点的坐标值及偏差来计 算。根据Fk+1的正、负号再确定绘图笔的下一步 走向,这样逐步进行,直到绘图笔到达圆弧的 终点为止。终点判断可由总走步数J(J=|xbxa|+|yb-ya|)来控制。每走一步J减去1,当J=0 时即到达终点。下面以一个例子说明。
圆弧的逐点插补法(13/15)
逐点画圆的原始代码程序
void CDddView::OnCircle1() {
//注意这个函数的参数为空,这个程序要能正常 运行要 注意把pDC和rect二个变量作为CDddView类的成员变量 //程序绘图接口
pDC=GetDC(); GetClientRect(rect); int xc=200,yc=200; //圆心 float r=100.3; //半径 int x=int(r+0.5); //起始点x坐标 int y=0; //起始点y坐标
Y B 6 5 4 2 3 1 A
O
X
图3-2
逐点比较法绘制圆弧实例
圆弧的逐点插补法(10/15)
思考:圆在现实生活中应用广泛,以优美, 对称的规则形状让很多人喜爱。太阳,月亮 是圆的,给了诗人们多少浪漫的幻想,留下 了多少传世诗篇,我们说圆了我们的梦想, 这个圆就有另一层含义了。绘制圆这个最简 单的二次曲线当然是我们图形学中的重要问 题。绘制圆的算法很多,这个在第三节我们 再介绍。根据圆的对称这个特点,我们在绘 制圆的过程中很简单,只要找到圆周的八分 之一圆弧的点,就可以通过对称性找到圆周 的所有点,如下图所示:
圆弧的逐点插补法(8/15)
例 用逐点比较法逆时针画圆弧AB,设起点为 A(4,3), 终点为B(0,5),圆心为O(0,0)。 算法生成圆弧从起点开始,总走步数 J=|0-4|+|5-3|=6,起点处F0=0,走步方向的规定 按第一象限进行。算法的计算过程列于下表,其 结果如图3-2所示。
圆弧的逐点插补法(9/15)
圆弧的逐点插补法(11/15)
圆周的八对称性质
(-y,x)
(y,x)
(-x,y)
(x,y)
O (-x,-y) (x,-y)
假设圆心在原点 x2+y2=R2
(-y,-x)
(y,-x)
圆弧的逐点插补法(12/15)
在计算机屏幕中绘制圆,圆心一般不
在坐标为(0,0)的位置,假设要绘制的 圆心在(XC,YC),那么来个坐标转换就 可以解决问题了,比如上面图形中的 圆上相对于圆心(0,0)任一点坐标 (x,y),转换到屏幕中以(XC,YC)为圆心 的圆,则实际坐标变为(XC+x, YC+y)。 这样在绘制的过程中我们只要加一个 实际圆心坐标就好了。
圆弧的逐点插补法 (14/15) //停止条件
while(x>=y) { pDC->SetPixel(xc+x,yc+y,color); pDC->SetPixel(xc+y,yc+x,color); pDC->SetPixel(xc-y,yc+x,color); pDC->SetPixel(xc-x,yc+y,color); pDC->SetPixel(xc-x,yc-y,color); pDC->SetPixel(xc-y,yc-x,color); pDC->SetPixel(xc+y,yc-x,color); pDC->SetPixel(xc+x,yc-y,color); //注意这个color也属于类的成员变量
圆弧的逐点插补法(2/15)
Y B(xb , yb ) K (xk , yk)
R
A(xa , ya )
O
X
图3-1
逐点比较法与圆弧的生成
圆弧的逐点插补法(3/15)
点K相对于圆弧AB的位置有三种情况:点K在AB外侧,点K 在AB上以及点K在AB内侧。为判断点K与 AB的相对位置,引入 偏差函数Fk,
圆弧的逐点插补法(5/15)
Fk 1 x
2 k 1
y
Biblioteka Baidu
2 k 1
R
2 k
2
( xk 1) y R
2 2 k 2 k 2
2
x y R 2 xk 1 Fk 2 xk 1
圆弧的逐点插补法(6/15)
绘图笔走+Δy时,新点坐标为
xk 1 xk , yk 1 yk 1
圆弧的逐点插补法 圆弧的Bresenham算法 绘制圆弧的其它几种方法 椭圆的生成算法 其它二次曲线绘制举例
3.1圆弧的逐点插补法
圆弧逐点插补法算法的基本思想是:在绘制 圆弧的过程中,每绘制一个点就与圆弧进行 比较,根据比较的结果决定下一步的走向, 这样一步一步逼近圆弧,逐点比较法的执行 过程如下: