java - 有人可以解释一下使用 DDA 扫描线给定 3 个顶点绘制三角形的逻辑吗?

标签 java graphics

假设我有 3 个顶点:(20, 20), (10, 60), (50, 60)

如何绘制三角形?

我想首先你需要连接顶点才能得到三角形的边。这可以通过获取斜率来完成吗?然后找到最左边的顶点,开始在 y 方向上递增并沿 x 方向设置像素,直到到达右边缘?

伪代码会非常有帮助,但我也很难理解基本思想。

最佳答案

有多种方法可以做到这一点。其中一种更简单的方法称为半空间方法,涉及在三角形周围绘制边界矩形,然后迭代矩形的所有像素。如果像素位于三角形内部,则为像素着色。

示例:

//Initialize these however you want to
int x1;
int x2;
int x3;
int y1;
int y2;
int y3;

//Bounding rectangle
int minX = min(x1, x2, x3)
int maxX = max(x1, x2, x3)
int minY = min(y1, y2, y3)
int maxY = max(y1, y2, y3)

for(int x = minX; x <= maxX; x++)
{
    for(int y = minY; y <= maxY; y++)
    {
        //If point in triangle
        if((x1 - x2) * (y - y1) - (y1 - y2) * (x - x1) > 0 &&
           (x2 - x3) * (y - y2) - (y2 - y3) * (x - x2) > 0 &&
           (x3 - x1) * (y - y3) - (y3 - y1) * (x - x3) > 0)
        {
            //Color pixel
        }
    }
}

min 和 max 方法必须由您实现,如果您不喜欢上面显示的方法,您可以使用任何您喜欢的方法来确定一个点是否在三角形中。

关于java - 有人可以解释一下使用 DDA 扫描线给定 3 个顶点绘制三角形的逻辑吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21869708/

相关文章:

java - 为什么在已经声明时处理或声明错误?

java - 在外部进程关闭之前,ProcessBuilder 的 InputStream 没有输入

java - Non-resolvable import POM Failure to find

c# - ZedGraph 填充区域

r - 如何用R中的数据值或百分比标记直方图条

JavaEE + eclipseLink + TomEE 给出 java.sql.SQLSyntaxErrorException : user lacks privilege or object not found

java - 通过 lambda java8 转换 xml 字符串

assembly - 将 2 个像素点在一起

graphics - 使用 Direct3D 时,CPU 上执行了多少数学运算?

.net - 将绘制的图像修改为圆角矩形