计算机图形学 二、图元输出-画线

核心功能:给定直线两端点P_{0}(x_{0},y_{0})P_{1}(x_{1},y_{1}),画出该直线。

1、数值微分法(DDA)

核心思想:找到一个增长最快的方向,每次增加1,其余方向增加对应的长度。

数学原理:

直线的微分方程:

x_{i+1}=x_{i}+\varepsilon \cdot \Delta x

y_{i+1}=y_{i}+\varepsilon \cdot \Delta y

其中\varepsilon为:

\varepsilon = 1/max(\left | \Delta x \right |,\left | \Delta y \right |)


情况A:max(\left | \Delta x \right |,\left | \Delta y \right |)=\left | \Delta x \right |,即\left | k \right |\leq 1的情况:

x_{i+1}=x_{i}+\frac{1}{\left | x \right |}\cdot \Delta x=x_{i}\pm 1

y_{i+1}=y_{i}+\frac{1}{\left | x\right |}\cdot \Delta y=y_{i}\pm k

情况B:max(\left | \Delta x \right |,\left | \Delta y \right |)=\left | \Delta x \right |,即\left | k \right |\leq 1的情况:

x_{i+1}=x_{i}+\frac{1}{\left | y \right |}\cdot \Delta x=x_{i}\pm \frac{1}{k}

y_{i+1}=y_{i}+\frac{1}{\left | y\right |}\cdot \Delta y=y_{i}\pm 1

对于不足1的增量,可以使用round()。(注意round(x)=(int)(x+0.5))。


特点:增量算法,直观、易实现。

缺点:浮点运算,取整费时,且不利于硬件实现。


openGL代码实现:

void DDAdrawLine()
{
	int x0 = m_iStartX, y0 = m_iStartY, x1 = m_iEndX, y1 = m_iEndY;
	int dx = x1 - x0;
	int dy = y1 - y0;
	int eps, k;
	float xIncrement, yIncrement;
	float x = x0, y = y0;

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

	xIncrement = float(dx) / float(eps);
	yIncrement = float(dy) / float(eps);

	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 0, 0);
	glBegin(GL_POINTS);
	glVertex3f(x0, y0, 0);
	for (int k = 0; k < eps; k++)
	{
		x += xIncrement;
		y += yIncrement;
		glVertex3f(x, y, 0);
	}
	glVertex3f(x1, y1, 0);
	glEnd();
}

2、中点画线算法

核心思想:假定直线斜率K<1,且易确定电量像素点P_{}(x_{p},y_{p}),M为中点,Q为交点,需确定下一个点亮的像素。根据其对中点的相对位置易求。

数学原理:给定直线两端点P_{0}(x_{0},y_{0})P_{1}(x_{1},y_{1}),该直线方程可表示为:

F\left ( x,y \right )=a*x+b*y+c

x_{k}处中点为P_{k},则:

P_{k}=F(x_{k} +1,y_{k} +\frac{1}{2})=a(x_{k} +1)+b(y_{k} +\frac{1}{2})+c

P_{k+1}=F(x_{k+1} +1,y_{k+1} +\frac{1}{2})=a(x_{k+1} +1)+b(y_{k+1} +\frac{1}{2})+c

P_{k+1}=P_{k}+a+b(y_{k+1}-y_{k})

P_{0}=F(x_{0}+1,y_{0}+\frac{1}{2})=F(x_{0},y_{0})+a+\frac{1}{2}*b

因为只用P的符号作为判断,为了只包含整数运算,可取2P代替P:

P_{0}=2*a+b

P_{k+1}=P_{k}+2a+2b(y_{k+1}-y_{k})

x_{k+1}=x_{k}+1

P_{k}\geq 0,取y_{k+1}=y_{k}P_{k+1}=P_{k}+2a

P_{k}<0,取y_{k+1}=y_{k}+1P_{k+1}=P_{k}+2(a+b)


3、Bresenham算法

基本原理:(假定直线线段0\leq k\leq 1

d=d+k,当d>1时d=d-1。当d<0.5时取(x+1,y),否则取(x+1,y+1)。

优化1:令e=d-0.5,每走一步e=e+k

优化2:用2e\Delta x来替换e。

e初=-\Delta x,每走一步有e=e+2\Delta y,如果e>0,y+1且e=e-2\Delta x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值