最新计算机地图制图原理与方法基本图形生成算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
直线生成算法的改进
如何利用上述算法实现任意直线的绘制?
关于线型线宽的说明
实线就是将选到所有的点都画出来 虚线就是在所选的点中选相邻的几个画,然后
接着相邻的几个不画 点线就是在所选的点中,每隔几个就画一个 线宽只对实线有效,实际上就是根据其倾斜角
然后选定是在选中的点的(x+-width/2, y)或者(x, y+-width/2)也画出来,相当于一把近似垂直于 直线的刷子
3.2.3 生成直线的Bresenham算法
Yi+1 Yi
D
B A
C
xi
Xi+1
原理:
dd
dd
假定直线斜率,0<k<1, 起点坐标为(x,y);
下一个点亮象素可能是:(x+1,y) 或 (x+1,y+1)。这可通过 d值的大小来确定:
d = d+k, 当d>1 时 d=d-1 ;
当d<=0.5取 (x+1,y),否则取(x+1,y+1)。令e=d-0.5, 显然 e 的初值为-0.5。这样可用e的符号来进行判断。
从速度考虑,还 有那些可以改进?
e=e+2*dy; x++;
if (e≥0) { y++; e=e-2*dx}
}
}
Bresenham画线算法示例
初始值:dx=7; dy=4; k= 4/7
8
7 6
5 4
3 2
1 0
起点
0
讨论象素点的选取是 否有规律?有何用
终点
123456 7
e=-7/14 1、X0=0, Y0=0, e=1/14 2、X1=1, Y1=1, e=-5/14 3、X2=2, Y2=1, e=3/14 4、X3=3, Y3=2, e=-3/14 5、X4=4, Y4=2, e=5/14 6、X5=5, Y5=3, e=-1/14 7、X6=6, Y6=3, e=7/14 8、X6=7, Y6=4, e=1/14
{ SetPixel (x, y, color);
if (d<0) {x++;y++; d+=d2; }
else
{x++; d+=d1;}
} /* while */
} /* midPointLine */
中点画线算法示例
初始值:a=-4; b=7; d= 2*a+b=-1;d1=2*a=-8; d2=2*(a+b)=6
程序如下:Байду номын сангаас
void Bresenhamline (int x0,int y0,int x1, int y1,int color)
{ int x, y, dx, dy; float k, e; dx = x1-x0;dy = y1- y0;k=dy/dx; x=x0,;y=y0; e=-0.5; for (i=0;i<=dx;i++) { Setpixel (x, y, color); x=x+1;e=e+k; if (e≥0) { y++; e=e-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;
while (x<=x1)
}
思考题: 如何去除上述程序中的浮点运算、乘除法?
程序改进
void Bresenhamline (int x0,int y0,int x1, int y1,int color)
{ dx = x1-x0,;dy = y1- y0,;e=-dx;
x=x0; y=y0;
for (i=0; i<=dx; i++) {Setpixel (x, y, color);
计算机地图制图原理与方法 基本图形生成算法
GPU:生成点阵图形
CPU
运行图形程序
内存 插槽
D/A转换:图形显示
3.2.2 生成直线的中点画线算法
假定直线斜率k在0~1之间,当前象素点为(xp,yp),则下一个象素点有 两种可选择点P1(xp+1,yp)或P2(xp+1,yp+1)。若P1与P2的中点 (xp+1,yp+0.5)称为M,Q为理想直线与x=xp+1垂线的交点。当M在Q的 下方时,则取P2应为下一个象素点;当M在Q的上方时,则取P1为下一个 象素点。这就是中点画线法的基本原理
8
7
6
5
终点
4
3
2
1
0
起点
0123456 7
1、X0=0, Y0=0, d=-1 2、X1=1, Y1=1, d=5 3、X2=2, Y2=1, d=-3 4、X3=3, Y3=2, d=3 5、X4=4, Y4=2, d=-5 6、X5=5, Y5=3, d=1 7、X6=6, Y6=3, d=-7 8、X6=7, Y6=4, d=-1
当d>0时,M在L(Q点)上方,取P1为下 一个象素;
当d=0时,选P1或P2均可,约定取P1为 下一个象素;
若当前象素处于d>=0情况,则取正右方象素P1(xp+1, yp),要判下一个象素 位置,应计算 d1=F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a,增量为a。
过点(x0,y0)、(x1, y1)的直线段L的方程式为F(x, y)=ax+by+c=0,欲判断中点M在Q点的上方还 是下方,只要把M代入F(x,y),并判断它 的符号即可。为此,我们构造判别式: d=F(M)=F(xp+1, yp+0.5)=a(xp+1)+b(yp+0.5)+c
当d<0时,M在L(Q点)下方,取P2为下 一个象素;
若d<0时,则取右上方象素P2(xp+1, yp+1)。要判断再下一象素,则要 计算d2= F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ,增量为a+b。 画线从(x0, y0)开始,d的初值 d0=F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b, 因 F(x0, y0)=0,所以d0=a+0.5b。 其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0。
关于多边形和圆形的作图
多边形 确定多边形的顶点 用直线顺序连接起来
圆形 根据圆的对称性将其扩展
到四个象限即可获得整圆
二、圆的生成算法
即是找出逼近圆的一组象素,按扫描线 顺序,对这些象素进行写操作。