中点画线算法(任意斜率)
2010-04-03 14:31
260 查看
基本原理
在画直线段的过程中,当前像素点为(xp
,yp
),下一个像素点有两种可选择点P1(xp
+1,yp
)或P2(xp
+1,yp
+1)。若M=(xp
+1,yp
+0.5)为P1与P2之中点,Q为P理想直线与x=xp
+1垂线的交点。当M在Q的下方,则P2应为下一个像素点;M在Q的上方,应取P1为下一个像素点。
在斜率0<=k<=1的时候,实现代码如下(书本代码):
void
MidpointLine(int
x0,int
y0,int
x1,int
y1,int
color)
{
int
a,b,d1,d2,d,x,y;
a=y0-y1,b=x1-x0,d=2*a+b;
d1=2*a,d2=2*(a+b);
x=x0,y=y0;
Drawpixel(x,y,color);
while
(x<x1)
{
if
(d<0)
{ x++,y++,d+=d2;}
else
{ x++,d+=d1; }
Drawpixel(x,y,color);
}
}
对于其他斜率,我们可以推出如下关系:
实现代码如下:
备注:Drawpixel(x,y,color);是pDC->SetPixel(x,y,crColor);的意思
在画直线段的过程中,当前像素点为(xp
,yp
),下一个像素点有两种可选择点P1(xp
+1,yp
)或P2(xp
+1,yp
+1)。若M=(xp
+1,yp
+0.5)为P1与P2之中点,Q为P理想直线与x=xp
+1垂线的交点。当M在Q的下方,则P2应为下一个像素点;M在Q的上方,应取P1为下一个像素点。
在斜率0<=k<=1的时候,实现代码如下(书本代码):
void
MidpointLine(int
x0,int
y0,int
x1,int
y1,int
color)
{
int
a,b,d1,d2,d,x,y;
a=y0-y1,b=x1-x0,d=2*a+b;
d1=2*a,d2=2*(a+b);
x=x0,y=y0;
Drawpixel(x,y,color);
while
(x<x1)
{
if
(d<0)
{ x++,y++,d+=d2;}
else
{ x++,d+=d1; }
Drawpixel(x,y,color);
}
}
对于其他斜率,我们可以推出如下关系:
实现代码如下:
void MidpointLine(int x0,int y0,int x1,int y1,int color) { int a,b,d1,d2,d,x,y;float m;if (x1<x0){d=x0,x0=x1,x1=d;d=y0,y0=y1,y1=d;} a=y0-y1,b=x1-x0;if (b==0) m=-1*a*100; else m=(float)a/(x0-x1);x=x0,y=y0; Drawpixel(x,y,color); if (m>=0 && m<=1) {d=2*a+b;d1=2*a,d2=2*(a+b); while (x<x1) { if (d<=0) { x++,y++,d+=d2;} else { x++,d+=d1; } Drawpixel(x,y,color); }} else if (m<=0 && m>=-1) {d=2*a-b;d1=2*a-2*b,d2=2*a; while (x<x1) { if (d>0) { x++,y--,d+=d1;} else { x++,d+=d2; } Drawpixel(x,y,color); } } else if (m>1) {d=a+2*b;d1=2*(a+b),d2=2*b; while (y<y1) { if (d>0) { x++,y++,d+=d1;} else { y++,d+=d2; } Drawpixel(x,y,color); } } else {d=a-2*b;d1=-2*b,d2=2*(a-b); while (y>y1) { if (d<=0) { x++,y--,d+=d2;} else { y--,d+=d1; } Drawpixel(x,y,color); }} }
备注:Drawpixel(x,y,color);是pDC->SetPixel(x,y,crColor);的意思
相关文章推荐
- 【Computer Graphics】2.直线生成算法(中点画线 算法)
- 中点画线算法程序
- 直线生成算法---中点画线法
- 计算机图形学 -- 画线算法 [DDA] [中点画线] [Bresenham]
- 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法
- 任意斜率的中点画线算法
- 计算机图形学:中点划线法(任意斜率)
- 直线扫描转换算法-中点画线法
- 51Nod 斜率最大(拉勾专业算法能力测评)
- 计算机图形学(一)DDA画线算法讲解与源代码
- Bresenham 中点画圆算法实现
- (4)直线的生成之中点画线法
- 计算机图形学(五)线段的中点分割裁剪算法讲解与源代码
- OpenGL 利用中点算法画抛物线:y = x*x / 16
- 从1..n中间选取任意组合,其和为m,列出所有组合的算法。
- openGL—中点Bresenham椭圆算法
- 面试算法:快速获取数组中点的相邻区域点
- javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
- shell版本的打印菱形---斜率算法
- [Java] 算法学习之旅 [0] -- 求任意三位数各个数位上数字的和