计算机图形学(三)朴素的软光栅(直线扫描转换算法、bresenham算法)

软光栅

不借助硬件资源实现光栅化的方式,叫做软光栅。

 

扫描转换

 

 

直线扫描转换算法

 

数值微分算法——Digital Differential Analyzer

一种直接从直线的微分方程生成直线的方法。通过给定直线的两端点坐标P0 (x0 ,y0 )和P1 (x1 ,y1 ),我们可以得到直线的微分方程:

 

令ε=1/max(|△x|,|△y|)

  • 情况一 斜率绝对值小于1:ε=1/|△x|

  • 情况二 斜率绝对值大于1:ε=1/|△y|

令ε=1/max(|△x|,|△y|) 使得ε△x或ε△y中会有一个变成单位步长。算法在最大位移方向上,每次总是走一步

 

DDA直线生成算法特点

在一个迭代算法中,如果每一步的x、y值是用前一步的值加上一个增量来获得的, 那么,这种算法就称为增量算法。因此,DDA算法是一个增量算法。

  • 优点:DDA算法直观、易实现
  • 缺点:有浮点数和浮点运算,效率不高

 

代码实现

#include<stdio.h>
#include<stdlib.h>
#include <graphics.h>

void DDAline(int x0, int y0, int x1, int y1) {
	int dx, dy, eps1, k;
	float x, y, xIncre, yIncre;

	dx = x1 - x0; 
	dy = y1 - y0;
	x = x0; 
	y = y0;

	if(abs(dx) > abs(dy)) 
		eps1 = abs(dx);
	else 
		eps1 = abs(dy);

	xIncre = (float)dx / (float)eps1;
	yIncre = (float)dy / (float)eps1;
	
	for (k = 0; k <= eps1; k++) {
		putpixel((int)(x + 0.5), (int)(y + 0.5));//在对应坐标处输出像素点
		x += xIncre;
		y += yIncre;
	}
}

 

 


bresenham算法

  • 输入:直线两个端点的坐标P0 (x0 ,y0 )和P1 (x1 ,y1 )
  • 输出:最佳逼近这条直线的像素点集

通过给定直线的两端点坐标P0 (x0 ,y0 )和P1 (x1 ,y1 ),可得到直线斜截式表示:y=kx+b

我们还可以写出它的隐式方程:

 

基本原理

假定0≤k≤1,x是最大位移方向。 M在Q的下方,取Pu;M在Q的上方,取Pd

       

直线隐式方程起作用   

构造判别式

 

基本原理

通过中点不直线的位置关系引入误差项d,判断误差项的符号来选择候选点

 

 


改进的bresenham算法

基本原理

在0≤k≤1情况下改进的Bresenham算法:

  • (1)输入直线的两端点P0 (x0 ,y0 )和P1 (x1 ,y1 )。
  • (2)计算初始值△x、△y、e=-△x、x=x0、y=y0。
  • (3)绘制点(x,y)。
  • (4)e更新为e+2△y 判断e的符号 :若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x; 否则(x,y)更新为(x+1,y)。
  • (5)当直线没有画完时,重复步骤3和4。否则结束。

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值