簡體   English   中英

java.awt.geom.Area對象重復點?

[英]java.awt.geom.Area object duplicating points?

我使用許多2D浮點多邊形。 我想出了一個用例,其中我需要一個減去另一個,所以我認為我會使用java.awt.geom.Area。 我創建一個具有四個點的Area對象:

100.0, 50.0
150.0, 0.0
151.41421356237308, 2.8284271247461112
99.99999999999973, 54.242640687118936

並且與創建區域時如何排序這些點無關,我得到以下信息:

SEG_MOVETO, 150.0, 0.0
SEG_LINETO, 100.0, 50.0
SEG_LINETO, 99.99999999999973, 54.24264068711893
SEG_LINETO, 99.99999999999974, 54.24264068711893
SEG_LINETO, 151.41421356237308, 2.8284271247461112
SEG_LINETO, 150.0, 0.0
SEG_CLOSE, 150.0, 0.0

注意幾乎相同的雙99.99999999999973, 54.24264068711893坐標。

任何避免這種情況的線索都將受到歡迎。 這是代碼:

import java.awt.geom.Area;
import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;

class Main {
    public static final void main( String args[] ) {
        double[] myPoly = {100.0, 50.0, 150.0, 0.0, 151.41421356237308, 2.8284271247461112, 99.99999999999973, 54.242640687118936};
        final Area myArea = makeArea(myPoly);
        System.out.println(areaToString(myArea));
    }

    private static Area makeArea(double coords[]) {
        final Path2D path = new Path2D.Double();
        path.moveTo(coords[0], coords[1]);
        for (int i = 2; i < coords.length; i+=2) {
            path.lineTo(coords[i], coords[i+1]);
        }
        path.closePath();
        return new Area(path);
    }

    private static String areaToString(final Area area) {
        final StringBuffer out = new StringBuffer("Area [\n");
        double []pt = new double[6];
        for (PathIterator pi = area.getPathIterator(null); !pi.isDone(); pi.next()) {
            int type = pi.currentSegment(pt);
            out.append(type).append(", ").append(pt[0]).append(", ").append(pt[1]).append("\n");
        }
        return out.append(']').toString();
    }
}

如果仔細查看這些值,您會發現99.99999999999973和99.99999999999974在彼此的最低精度(ULP)單位內。 這是浮點數的常見問題。 您不能完全代表每個數字。

如果您進行更改並使用類似的方法直接打印出Path2D對象,則不會發生任何重復。

區域狀態的Javadoc

即使原始輪廓簡單明了,一個區域也可能需要更多路徑段來描述相同的幾何圖形。 Area類必須在路徑上執行的分析可能無法反映出人類所感知的“簡單而明顯”的概念。

因此,總而言之,該區域可能會優化Path對象,從而引入您看到的工件。 我還沒有深入研究Area的源代碼,以了解如何選擇這種路徑的特定分解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM