直线微分法软光栅
1.关于光栅化
光栅化是指将图形或图像转换为由像素或点阵组成的二维网格的过程。在计算机图形学中,光栅化是将矢量图形或几何图形(如直线、多边形等)转换为屏幕上的像素表示的过程。
在图形渲染过程中,光栅化是一个重要的步骤。当计算机系统接收到要显示的图形或图像时,需要将其转换为屏幕上的像素来进行显示。这个过程涉及到将图形对象的几何信息转换为像素的位置和颜色值,以便最终在屏幕上呈现出来。
2.关于DDA算法(只讨论直线斜率 k>=0并且直线两端点x不相等的情况)
一种根据直线微分算法生成光栅化离散点的过程
给定直线两端坐标P0(x0, y0), P1(x1, y1),可以得到直线微分方程
dy / dx = (y1 - y0) / (x1 - x0) = k
在知道直线起点坐标的情况下,就可以得到构成直线一系列点坐标
假定当前点坐标Pi(0, 0), 那么下一个点的像素坐标就是Pi1(1, 0 + k),
每画一个点x累加1,y累加k,但是k是小数,还需要对y进行取整
用伪代码写出来就是
float y = pos1_.y();
int x = pos1_.x();
do {
draw_point(QPoint(x, (int)roundf(y)));
x += 1;
y += k;
} while (x <= pos2_.x());
如果给定两点P0(0, 0),P1(8, 5)就可以绘制出如下图形
可以看到光栅化的点分布比较理想
但是如果输入的两端点变成P0(0, 0),P1(5, 8),也就是斜率大于1的情况
可以看到y=1, y=4, y=7时都没有点分布
也就是需对直线斜率 k>1 与 1 >= k >= 0 的情况分别处理
对于k>1的情况
假定当前点坐标Pi(0, 0), 那么下一个点的像素坐标就是Pi1(0 + 1 / k, 1)
也就是y累加1,x累加1/k,同样也需要对x进行取整
伪代码表示
float x = pos1_.x();
int y = pos1_.y();
do {
draw_point(QPoint((int)roundf(x), y));
y += 1;
x += 1.0f / k;
} while (y <= pos2_.y());
绘制出来的图形就是下图所示
可以看到图片点分布明显得到改善
3.对于斜率 k<0情况
对于负斜率的线则是把相应的 +k 与 +1/k 调整为 -k 与 -1/k既可
4.对于直线斜率无限大也就是两端点 x相等的情况
那么就光栅化就只需要改变y值既可
5.实用工具分享
实用工具分享
版权归原作者 weixin_49505330 所有, 如有侵权,请联系我们删除。