案例4椭圆中点Bresenham算法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(9)判断d2的符号。若d2<0,则(x,y)更新为(x+1,y-1),d2更新为 d2+b2(2x+2)+a2(-2y+3);否则(x,y)更新为(x,y-1),d2更新 为d2+a2(2y+3)。 (10)如果y≥0时,重复步骤(8)和(9),否则结束。
案例4椭圆中点Bresenham算法
7
算法
心位置进行了平移,使得矩形成为椭圆的外接矩形。请在四分
法画椭圆子函数EllipsePoint()中添加以下语句绘制一个对角点
为p0、另一个对角点为p1的矩形,该矩形成为椭圆的外接矩形 。如图4-2所示。
pDC->MoveTo(Round(p0.x),Round(p0.y));
4
, 原理

y A
ⅠⅠ
dy 1
dy 1 dx
dx

Ⅱddyx
CC
1
O
Bx
在区域Ⅰ内,有
dy 1 dx
即dx>dy所以x方向为主位移方向;
在临界点处,有dx=dy;在区域Ⅱ内,有 dy 1 即dy>dx
,所以y方向为主位移方向。
dx
显然,在临界点处,主位移方向发生改变。
图4-2椭圆弧的临界点的定义
pDC->SetPixelV(Round(-x+pc.x),Round(-y+pc.y),clr);
}
案例4椭圆中点Bresenham算法
11
总结
本案例绘制的是任意椭圆,也可以用于绘制长半轴与短半
轴相等的圆。由于可以使用鼠标任意指定矩形的对角点,所以
椭圆中心的位置会发生改变。在四分法画椭圆子函数中,对中
9
}
程序代码
(1)椭圆中点Bresenham函数 d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b; while(y>0) { if (d2<0) { d2+=b*b*(2*x+2)+a*a*(-2*y+3); x++; } else { d2+=a*a*(-2*y+3); } y--; EllipsePoint(x,y ,pDC); }
案例4椭圆中点Bresenham算法
6
算法
(1)根据鼠标选择的矩形对角点计算椭圆的长半轴a和短半轴b。
(2)定义椭圆当前点坐标x,y、定义中点误差项d1与d2、定义像素点颜色clr。 (3)计算 ,x=0,y=b,clr=RGB(0,0,255)。
(4)绘制点(x,y)及其在四分椭圆中的另外3个对称点。
(5)判断d1的符号。若d1<0,则(x,y)更新为(x+1,y),d1更新为d1+b2 (2x+3);否则(x,y)更新为(x+1,y-1),d1更新为d1+b2(2x+3)+ a2(-2y+2)。
(6)当 时,重复步骤(4)与(5),否则转到步骤(7)。
(7)计算下半部分d2的初值: 。 (8)绘制点(x,y)及其在四分椭圆中的另外3个对称点。
COLORREF clr=RGB(0,0,255);
//定义椭圆的颜色
pDC->SetPixelV(Round(x+pc.x),Round(y+pc.y),clr);
pDC->SetPixelV(Round(-x+pc.x),Round(y+pc.y),clr);
pDC->SetPixelV(Round(x+pc.x),Round(-y+pc.y),clr);
算法。 给定矩形的两个对角点绘制椭圆。 鼠标按键消息映射方法。
案例4椭圆中点Bresenham算法
2
案例描述
在窗口客户区内按下鼠标左键选择矩形 的一个对角点,同时移动鼠标指针到矩形的 另一个对角点,弹起鼠标左键绘制矩形的内 切椭圆。
案例4椭圆中点Bresenham算法
3
效果图
图4案-1例4效椭圆果中图点Bresenham算法
圆心在坐标系原点的1/8圆中点Bresenham算法如下: (1)根据鼠标选择的直线端点计算圆的半径R。 (2)定义圆当前点坐标x,y、定义中点误差项d、定义像素 点颜色clr。 (3)计算 ,x=0,y=R,clr=RGB(0,0,255)。 (4)绘制点(x,y)及其在八分圆中的另外7个对称点。 (5)判断d的符号。若d<0,则(x,y)更新为(x+1,y) ,d更新为d+2x+3;否则(x,y)更新为(x+1,y-1), d更新为d+2(x-y)+5。 (6)当x小于等于y,重复步骤(4)与(5),否则结束。
案例4椭圆中点Bresenham算法
8
代码
(1)椭圆中点Bresenham函数
void CTestView::MBEllipse(CDC *pDC)
{
double x,y,d1,d2,a,b;a=fabs(p1.x-p0.x)/2;b=fabs(p1.y-p0.y)/2;
x=0;y=b; d1=b*b+a*a*(-b+0.25);
案例4椭圆中点Bresenham算法
5
原理
x方向为主位移方向 y
(0,b)
Pi Pu
Pd
Pi
y方向为主位移方向


Pl Pr
O
(a,0) x
在上半区域Ⅰ,x方向上每次加1,y方向上减1不减1取决于中点 误差项的值;
在下半区域Ⅱ,y方向上每次减1,x方向上加不加1取决于中点 误差项的值。
图4-3 椭圆弧的中点算法原理
案例4椭圆中点Bresenham算法
//椭圆CB弧段
10
程序代码
(2)四分法画椭圆子函数
void CTestView::EllipsePoint(double x, double y ,CDC *pDC)
{
CP2 pc=CP2((p0.x+p1.x)/2.0,(p0.y+p1.y)/2.0); //椭圆中心坐标
EllipsePoint(x,y ,pDC);
Fra Baidu bibliotek
while(b*b*(x+1)<a*a*(y-0.5))
//椭圆AC弧段
{
if (d1<0)
d1+=b*b*(2*x+3);
else
{
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
y--;
}
x++;
EllipsePoint(x案,y例,p4D椭C圆)中; 点Bresenham算法
计算机图形学实践教程(VisualC++版)(第2版)
案例4 椭圆中点Bresenham算法
2017.1.10
案例4椭圆中点Bresenham算法
1
知识点
绘制1/4椭圆弧的上半部分和下半部分的 中点Bresenham算法原理。
下半部分椭圆误差项的初始值计算方法。 顺时针四分法绘制椭圆的中点Bresenham
相关文档
最新文档