返回顶部

计算机图形学初步 - 1

华南理工大学 梁宇正

老师教的直线段Bresenham扫描转换算法中直线段的两端均为整数,那么这里也同样假设 $c_x, c_y ,r $均为整数。公式推导时需要使用的是与圆心的相对坐标,所以只考虑圆心在原点的情况,其他情况只需要进行一个坐标偏移。

\([\frac{\pi}{4},\frac{\pi}{2}]\) 的圆弧段中,圆切线的斜率范围为 \([-1,0]\) ,仿照直线段Bresenham扫描转换算法,每次 \(x_{i+1}=x_i+1\) ,而因为斜率的范围的原因,所以 \(y_{i+1}\) 只有两种取法:\(y_{i+1}=y_i\)\(y_{i+1}=y_i-1\)

考虑即将点亮的两个像素与圆的位置关系。一共有4种情况

当圆恰好穿过其中一个点时,点亮对应的点即可。

当两个点都在圆外时,\(y_i-1\) 的误差显然更小,选择 \(y_{i+1}=y_i-1\)
当两个点都在圆内时,\(y_i\) 的误差显然更小,选择 \(y_{i+1}=y_i\)

最后一种情况,点 \((x_i+1,y_i-1)\) 在圆内,而 \((x_i+1,y_i)\) 在圆外,比较他们与圆的误差关系。

首先我选择的“误差”是指点亮的点到圆心的距离与半径r的差的绝对值:

圆外的点 \((x_i+1,y_i)\) 满足
$dH= \sqrt{(x_i+1)2+y_i2} - R $
圆内的点 \((x_i+1,y_i-1)\) 满足
\(dL= R - \sqrt{(x_i+1)^2+(y_i-1)^2}\)

仿照直线段Bresenham扫描转换算法,现在要比较 \(dH\)\(dL\) 的大小关系,作差
判别式为

\(\Delta = dH- dL= \sqrt{(x_i+1)^2+y_i^2} + \sqrt{(x_i+1)^2+(y_i-1)^2} - 2R\)

这个方法到这里我就做不下去了,貌似没有办法再化简了,而上面的方程和暴力使用方程计算没有分别。

考虑到两个像素实际上只有1个 \(y\) 坐标的差异,所以一个点在圆内一个点在圆外时,点到圆心的距离与半径 \(r\) 的差必定不超过1。

因为在 \(x_1∈[0,1]\) ,且 \(x_2∈[0,1]\) 时,假如 \(x1>x2\) 必有 \(x1^2>x2^2\) ,根据这个性质我认为可以改作比较点到圆心的距离与半径 \(r\) 的差的平方。

最后我把“误差”定为点亮的点到圆心的距离的平方与半径 \(r\) 的平方的差,则有:

圆外的点 \((x_i+1,y_i)\) 满足
\(dH= (x_i+1)^2+y_i^2 – R^2\)
圆内的点 \((x_i+1,y_i-1)\) 满足
\(dL= R^2 - (x_i+1)^2-(y_i-1)^2\)

仿照直线段Bresenham扫描转换算法,现在要比较 \(dH\)\(dL\) 的大小关系,作差,判别式为

\(\Delta = dH- dL= (x_i+1)^2+y_i^2 + (x_i+1)^2+(y_i-1)^2 - 2R^2\)

定义第 \(i\) 个点有 \(p_{i}= x_i^2+y_i^2 – 2R^2\)

则上式可化简为
\(\begin{align} \Delta&= x_i^2+2x_i+1+y_i^2 +x_i^2+2x_i+1+y_i^2-2y_i+1 - 2R^2\\ &=2p_i+4x_i -2y_i+3\\ \end{align}\)

那么根据 $\Delta $ 的符号就可以确定选择哪个点了。但是看起来还是有多余的计算,设一个 \(q_i=2p_i+4x_i -2y_i\) ,那么只需要比较 \(\Delta=q_i+3\) 的符号就可以了。

再考虑如何从 \(q_i\) 推导出 \(q_{i+1}\)

当选择点 \((x_i+1,y_i)\) 时,得

新的点:
\(\begin{align} q_{i+1}&=2((x_i+1)^2+y_i^2 – 2R^2)+ 4(x_i+1)-2y_i\\ &=2x_i^2+2 y_i^2+8 x_i-2y_i+6-4R^2 \end{align}\)

旧的点:
\(\begin{align} q_{i}&=2p_i+4x_i -2y_i\\ &=2x_i^2+2y_i^2 – 4R^2+4x_i -2y_i\\ \end{align}\)

两式作差得:
\(q_{i+1}- q_{i}=4x_i+6=4x_{i+1}+2\)

当选择点 \((x_i+1,y_i-1)\) 时,得

新的点:
\(\begin{align} q_{i+1} &= 2((x_i+1)^2+(y_i-1)^2 – 2R^2)+ 4(x_i+1)-2(y_i-1)\\ &=2 x_i^2+2 y_i^2+8 x_i-6y_i+10-4R^2 \end{align}\)

旧的点:

\(\begin{align} q_i&=2p_i+4x_i -2y_i\\ &=2x_i^2+2y_i^2 – 4R^2+4x_i -2y_i \end{align}\)

两者作差得:
\(q_{i+1}- q_{i}=4x_i-4y_i+10=4x_{i+1}-4y_{i+1}+10\)

posted @ 2019-09-19 22:00  Inko  阅读(170)  评论(0编辑  收藏  举报