Scanline算法:如何计算交点

彼得

我必须从我们的教授那里实现扫描线算法,但是我不太了解如何从扫描线与多边形获得交点。这是算法:扫描线算法

我已经实现了自己的多边形(已使用,方法,诸如此类)paint()contains()并且多边形的所有边都保存在数组中,如下所示:

int[] pointsX;
int[] pointsY;

我将x和y的最小值和最大值保存在

int ymin, ymax, xmin, xmax;

因此,我首先想到的是,我必须创建一条从其开始的扫描线,0,ymin并在循环中检查下一个点是否在多边形内。我实现了这样的方法:

public boolean contains(Point test) {
    boolean result = false;

    java.awt.Polygon polygon = new java.awt.Polygon(pointsX, pointsY, pointsX.length);
    if (polygon.contains(test)) {
        result = true;
    }

    return result;
}

因此,当下一个点在多边形内部时,我有一个交点,依此类推。为此,我有这个循环:

ArrayList<Point> intersectionPoints = new ArrayList<>();
wasInside = false;
    for (int yTemp = ymin; yTemp <= ymax; yTemp++) {
        for (int xTemp = xmin; xTemp <= xmax; xTemp++) {
            if (wasInside != this.contains(new Point(xTemp, yTemp))) {
                intersectionPoints.add(new Point(xTemp, yTemp));
                wasInside = !wasInside;
            }
        }
    }

但是我从我的stackoverflow问题中得到了一个暗示,这不是正确的解决方案

有人可以给我一个提示,我如何从教授那里开始实现算法?我在哪里可以得到x1,y1,x2,y2,c点?我知道这些是边缘,但是我怎么知道必须走哪条边缘呢?

编辑:确定,现在我所有的边按其y值排序。我可以使用给定的公式Sx = x1 +(x2-x1)/ ...计算交点吗?我的第一次尝试如下所示:

for (int c = ymin; c <= ymax; c++) {
        for (int xTemp = xmin; xTemp <= xmax; xTemp++) {
            for (int currentEdge = 0; currentEdge < edges.size() - 1; currentEdge++) {
                int x1 = edges.get(currentEdge).x;
                int x2 = edges.get(currentEdge + 1).x;
                int y1 = edges.get(currentEdge).y;
                int y2 = edges.get(currentEdge + 1).y;
                if ((y1 <= c && y2 > c) || (y2 <= c && y1 > c)) {
                    intersectionPoints.add(new Point((x1 + (x2 - x1) / (y2 - y1) * (c - y1)),c));
                }
            }
        }
    }

但这似乎是错误的,因为在中得到了很多错误的积分intersectionPoints

彼得

问题是我用int数字计算,然后int除以另一个int结果,结果是不准确的。因此,只需使用double数字即可解决。

这就是我计算交点的方式:edges是一个ArrayList<Point>包含边缘点的。ymin是最低的y值,而ymax是最高的y值。

for (int yTemp = ymin; yTemp <= ymax; yTemp++) {
        ArrayList<Point> intersectionPoints = new ArrayList<>();

        for (int p = 0; p < edges.size() - 1; p++) {
            int x1, x2, y1, y2;
            double deltax, deltay, x;
            x1 = edges.get(p).x;
            y1 = edges.get(p).y;
            x2 = edges.get(p + 1).x;
            y2 = edges.get(p + 1).y;

            deltax = x2 - x1;
            deltay = y2 - y1;

            int roundedX;
            x = x1 + deltax / deltay * (yTemp - y1);
            roundedX = (int) Math.round(x);
            if ((y1 <= yTemp && y2 > yTemp) || (y2 <= yTemp && y1 > yTemp)) {
                intersectionPoints.add(new Point(roundedX, yTemp));
            }
        }
        //for the last interval
        int x1, x2, y1, y2;
        x1 = edges.get(edges.size() - 1).x;
        y1 = edges.get(edges.size() - 1).y;
        x2 = edges.get(0).x;
        y2 = edges.get(0).y;
        if ((y1 <= yTemp && y2 > yTemp) || (y2 <= yTemp && y1 > yTemp)) {
            intersectionPoints.add(new Point(x1 + (x2 - x1) / (y2 - y1) * yTemp - y1, yTemp));
        }
        //you have to sort the intersection points of every scanline from the lowest x value to thr highest
        Collections.sort(intersectionPoints, new SortXPoints());
        pointsOfScanline.add(intersectionPoints);

这将为您提供一个ArrayList,其中包含每个Scanline的scanline点的ArrayList。因此,您只需要使用即可绘制它们drawLine(x1, y2, x2, y2)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

scanline:找到相交点

来自分类Dev

scanline:找到相交点

来自分类Dev

如何计算法线矩阵?

来自分类Dev

如何计算Java PrefixAverages算法

来自分类Dev

如何查找和计算列表和文本之间的多个交点?

来自分类Dev

如何根据角和像元数计算交点

来自分类Dev

数值误差计算交点

来自分类Dev

计算图上点的交点

来自分类Dev

计算线交点的问题

来自分类Dev

如何计算算法中的运算次数?

来自分类Dev

如何为该算法计算Big O?

来自分类Dev

您如何计算算法的大O

来自分类Dev

如何计算算法中的运算次数?

来自分类Dev

如何计算安全算法的密钥大小?

来自分类Dev

用于查找区间之间的交点的Java算法

来自分类Dev

在极平面中找到交点的算法

来自分类Dev

如何计算二次贝塞尔曲线和水平线之间的交点?

来自分类Dev

如何使用Matlab以简单的方式计算两个矩形之间的交点?

来自分类Dev

计算交点时避免numpy循环

来自分类Dev

在处理中计算椭圆和直线的交点

来自分类Dev

如何计算DFS算法的时间复杂度?

来自分类Dev

如何确定嵌套循环算法的计算复杂度?

来自分类Dev

无法理解我的书如何计算算法步骤

来自分类Dev

如何在SQL中计算算法字符串

来自分类Dev

此算法如何计算32位整数中的设置位数?

来自分类Dev

如何计算适应度函数(遗传算法)?

来自分类Dev

如何计算此素数查找器算法的T(N)

来自分类Dev

如何计算此算法的时间复杂度

来自分类Dev

如何计算这种斐波那契算法的效率?