计算机图形学图形生成技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这两条规律可以导致程序的简化。 使用DDA算法,每生成一条直线做两次除法,每画线中一 点做两次加法。因此,用DDA法生成直线的速度是相当快的。
DDA算法
例:画直线段P0(0,0) --P1(5,2)
x int(y+0.5)
y + 0.5
00
0 + 0.5
10 21
0.4+0.5 0.8+0.5
Line: P0(0, 0)-- P1(5, 2) 3
ห้องสมุดไป่ตู้31
1.2+0.5 2
42 52
1.6+0.5 1
2.0+0.5
0 12 3 4 5
DDA程序
# include “conio.h" # include "graphics.h" # define closegr closegraph
void initgr(void) /* BGI初始化 */
{ int gd=DETECT,gm=0; initgraph(&gd,&gm,"");
G x , y F x , y 0;
G x , y F x , y 0;
0
0
F(x,y)<0
假定已经求得像素(xi,yi,r),由四舍五入取整原则可知(下图)
y i
y i ,r
1 2
,
y i ,r
1 2
由于P0P1的斜率在[0,1]之间,故x = xi +1和P0P1的交点的纵坐标:
} else { k=1/k; x=x1;
for(y=y1;y<=y2;y++) { putpixel((int)(x+0.5),(int)y,color); x+=k; }
} }
DDA程序
main( )
{initgr( ); /* BGI初始化 */
DDALine(100,100,200,200,6) ; getch( ); closegr( ); }
为了简化算法,给出两点假设: 直线段的宽度为1; 直线段的斜率|k| ≤1;对于斜率 |k| >1 的直线段的生成方法 可对算法做适当改变得到。
DDA算法
3.1直线图形
DDA是数值微分法(Digital Differential Analyzer)的缩写。 设直线起点(x1,y1),终点(x2,y2),则斜率m(|m| ≤1) 为:
DDA算法
思考题: DDA算法能实现所有直线的画法吗?
中点画线法
中点画线法
3.1直线图形
影响DDA算法效率的有两点:一是采用了浮点加法;二
是浮点数在显示输出时需要取整。中点算法利用“整数加法,
不含乘除法,可用硬件实现”使效率大大提高。
假定直线段的斜率k在[0,1]之间,直线段左下方端点为
P0(x0,y0),右上方端点为P1(x1,y1)。直线段方程为:
DDA算法
直线图形上的点是由有先后顺序的一列像素点构成的,
相邻的两点应满足: m= (yi+1-yi ) / (xi+1-xi )
于是有:
yi+1 = yi + m(xi+1-xi )
其中(xi,yi)是第i步求得的像素点坐标,(xi+1, yi+1)是第i + 1
步求得的像素点坐标。据前面的分析,应要求:| xi+1-xi | ≤1
b. |m| >1
当y2-y1 ≥0时: yi+1 = yi +1;xi+1 = xi +1/m; 当y2-y1 ≤0时: yi+1 = yi -1;xi+1 = xi -1/m;
DDA算法
象限 |dx|>|dy|
Dx
Dy
?
1a
1
m
1b
1/m
1
2a
-1
m
2b
-1/m
1
3a
-1
-m
3b
-1/m
-1
4a
第3章 二维图形生成技术
第3章 二维图形生成技术
3.1 直线图形 3.2 二次曲线 3.3 字 符 3.4 区域填充
3.1 直线图形
3.1 直线图形
扫描转换直线段就是计算出落在直线段上或充分靠近它的 一串象素,并以此象素近似代替原连续直线段在屏幕上显示的 过程。本节介绍画线的三个常用算法:数值微分法,中点画线 法和Bersenham法。
}
DDA程序
void LineDDA(int x1,int y1,int x2,int y2,int color) { float x,y,dx,dy,k;
dx=x2-x1; dy=y2-y1; k=dy/dx; if(k >= -1 && k <= 1)
{ y=y1; for(x=x1;x<=x2;x++) { putpixel((int)x,(int)(y+0.5),color); y+=k; }
y=mx+b;b = (y2x1 - y1x2)/(x2 - x1) m=dy/ dx; dy=y2-y1;dx=x2-x1; 画直线算法: 给定直线的两个端点坐标后,求得m和b;然后 在x1≤x≤x2范围内对x取整数,利用公式进行浮点乘法和加法运算, 求得y值后再取整数值,即可得到需要的直线上的像素点。 计算方法的缺点是计算量大。
1
-m
4b
1/m
-1
假设: xi+1 - xi =Dx yi+1 - yi =Dy Dy = m ·Dx 则有: xi+1 = xi + Dx yi+1 = yi +Dy Dy = m ·Dx
DDA算法
研究表中的数据,可以发现两个规律: 1、当|dx|>|dy|时 |Dx|=1, |Dy|=m;
当|dx|<|dy|时 |Dx| =1/m,|Dy|=1; 2、Dx,Dy的符号与dx,dy的符号相同;
y kx B y Δy x B Δxy Δyx ΔxB Δx
F(x, y) Δxy Δyx ΔxB
F(x,y)=0
直线F(x,y)=0将二维空间成3个部分,
F(x,y)>0
这种性质称为直线的正负划分性。
F(x,y)<0
0
F(x,y)=0
中点画线法
F(x,y)>0
G x , y F x , y 0;
| yi+1-yi | ≤1
并要求较大者为1。即如果|m| ≤1 ,则要求 | xi+1-xi | =1
| yi+1-yi | ≤1
那么,当|m| >1 时,则要求 | xi+1-xi |<1
| yi+1-yi |=1
DDA算法
于是,画直线的DDA算法可分两种情况描述为:
a. |m| ≤1
当x2-x1 ≥0时: xi+1 = xi +1; yi+1 = yi +m 当x2-x1 ≤0时: xi+1 = xi -1; yi+1 = yi -m
DDA算法
例:画直线段P0(0,0) --P1(5,2)
x int(y+0.5)
y + 0.5
00
0 + 0.5
10 21
0.4+0.5 0.8+0.5
Line: P0(0, 0)-- P1(5, 2) 3
ห้องสมุดไป่ตู้31
1.2+0.5 2
42 52
1.6+0.5 1
2.0+0.5
0 12 3 4 5
DDA程序
# include “conio.h" # include "graphics.h" # define closegr closegraph
void initgr(void) /* BGI初始化 */
{ int gd=DETECT,gm=0; initgraph(&gd,&gm,"");
G x , y F x , y 0;
G x , y F x , y 0;
0
0
F(x,y)<0
假定已经求得像素(xi,yi,r),由四舍五入取整原则可知(下图)
y i
y i ,r
1 2
,
y i ,r
1 2
由于P0P1的斜率在[0,1]之间,故x = xi +1和P0P1的交点的纵坐标:
} else { k=1/k; x=x1;
for(y=y1;y<=y2;y++) { putpixel((int)(x+0.5),(int)y,color); x+=k; }
} }
DDA程序
main( )
{initgr( ); /* BGI初始化 */
DDALine(100,100,200,200,6) ; getch( ); closegr( ); }
为了简化算法,给出两点假设: 直线段的宽度为1; 直线段的斜率|k| ≤1;对于斜率 |k| >1 的直线段的生成方法 可对算法做适当改变得到。
DDA算法
3.1直线图形
DDA是数值微分法(Digital Differential Analyzer)的缩写。 设直线起点(x1,y1),终点(x2,y2),则斜率m(|m| ≤1) 为:
DDA算法
思考题: DDA算法能实现所有直线的画法吗?
中点画线法
中点画线法
3.1直线图形
影响DDA算法效率的有两点:一是采用了浮点加法;二
是浮点数在显示输出时需要取整。中点算法利用“整数加法,
不含乘除法,可用硬件实现”使效率大大提高。
假定直线段的斜率k在[0,1]之间,直线段左下方端点为
P0(x0,y0),右上方端点为P1(x1,y1)。直线段方程为:
DDA算法
直线图形上的点是由有先后顺序的一列像素点构成的,
相邻的两点应满足: m= (yi+1-yi ) / (xi+1-xi )
于是有:
yi+1 = yi + m(xi+1-xi )
其中(xi,yi)是第i步求得的像素点坐标,(xi+1, yi+1)是第i + 1
步求得的像素点坐标。据前面的分析,应要求:| xi+1-xi | ≤1
b. |m| >1
当y2-y1 ≥0时: yi+1 = yi +1;xi+1 = xi +1/m; 当y2-y1 ≤0时: yi+1 = yi -1;xi+1 = xi -1/m;
DDA算法
象限 |dx|>|dy|
Dx
Dy
?
1a
1
m
1b
1/m
1
2a
-1
m
2b
-1/m
1
3a
-1
-m
3b
-1/m
-1
4a
第3章 二维图形生成技术
第3章 二维图形生成技术
3.1 直线图形 3.2 二次曲线 3.3 字 符 3.4 区域填充
3.1 直线图形
3.1 直线图形
扫描转换直线段就是计算出落在直线段上或充分靠近它的 一串象素,并以此象素近似代替原连续直线段在屏幕上显示的 过程。本节介绍画线的三个常用算法:数值微分法,中点画线 法和Bersenham法。
}
DDA程序
void LineDDA(int x1,int y1,int x2,int y2,int color) { float x,y,dx,dy,k;
dx=x2-x1; dy=y2-y1; k=dy/dx; if(k >= -1 && k <= 1)
{ y=y1; for(x=x1;x<=x2;x++) { putpixel((int)x,(int)(y+0.5),color); y+=k; }
y=mx+b;b = (y2x1 - y1x2)/(x2 - x1) m=dy/ dx; dy=y2-y1;dx=x2-x1; 画直线算法: 给定直线的两个端点坐标后,求得m和b;然后 在x1≤x≤x2范围内对x取整数,利用公式进行浮点乘法和加法运算, 求得y值后再取整数值,即可得到需要的直线上的像素点。 计算方法的缺点是计算量大。
1
-m
4b
1/m
-1
假设: xi+1 - xi =Dx yi+1 - yi =Dy Dy = m ·Dx 则有: xi+1 = xi + Dx yi+1 = yi +Dy Dy = m ·Dx
DDA算法
研究表中的数据,可以发现两个规律: 1、当|dx|>|dy|时 |Dx|=1, |Dy|=m;
当|dx|<|dy|时 |Dx| =1/m,|Dy|=1; 2、Dx,Dy的符号与dx,dy的符号相同;
y kx B y Δy x B Δxy Δyx ΔxB Δx
F(x, y) Δxy Δyx ΔxB
F(x,y)=0
直线F(x,y)=0将二维空间成3个部分,
F(x,y)>0
这种性质称为直线的正负划分性。
F(x,y)<0
0
F(x,y)=0
中点画线法
F(x,y)>0
G x , y F x , y 0;
| yi+1-yi | ≤1
并要求较大者为1。即如果|m| ≤1 ,则要求 | xi+1-xi | =1
| yi+1-yi | ≤1
那么,当|m| >1 时,则要求 | xi+1-xi |<1
| yi+1-yi |=1
DDA算法
于是,画直线的DDA算法可分两种情况描述为:
a. |m| ≤1
当x2-x1 ≥0时: xi+1 = xi +1; yi+1 = yi +m 当x2-x1 ≤0时: xi+1 = xi -1; yi+1 = yi -m