从java.awt.geom.Area转换为java.awt.Polygon

我需要将java.awt.geom.Area或java.awt.Shape转换为java.awt.Polygon.我所知道的是:isSingular = true,isPolygonal = true.因此,我认为多边形应该能够描述相同的区域.

解决方法:

我不确定是否值得转换,因为Polygon是一个旧的Java 1.0类,只能存储整数坐标,因此您可能会失去一些精度.
无论如何,您可以从Shape中获取PathIterator,并在对其进行迭代时将新点添加到Polygon中:

public static void main(String[] args) {
    Area a = new Area(new Rectangle(1, 1, 5, 5));
    PathIterator iterator = a.getPathIterator(null);
    float[] floats = new float[6];
    Polygon polygon = new Polygon();
    while (!iterator.isDone()) {
        int type = iterator.currentSegment(floats);
        int x = (int) floats[0];
        int y = (int) floats[1];
        if(type != PathIterator.SEG_CLOSE) {
            polygon.addPoint(x, y);
            System.out.println("adding x = " + x + ", y = " + y);
        }
        iterator.next();
    }
}

编辑正如比尔·林(Bill Lin)所说,如果PathIterator描述了多个子路径(例如,在带孔的区域的情况下),则此代码可能会给您一个错误的多边形.为了考虑到这一点,还需要检查PathIterator.MOVETO段,并可能创建一个多边形列表.

为了确定哪些多边形是孔,您可以计算边界框(Shape.getBounds2D()),然后检查哪个边界框包含另一个多边形.请注意,getBounds2D API表示“无法保证返回的Rectangle2D是包围Shape的最小边界框,只能保证Shape完全位于指定的Rectangle2D内”,但根据我的经验,多边形将是最小的,无论如何,要计算多边形的确切边界框很简单(只要找到最小和最大的x和y坐标)即可.

上一篇:java-更改JFrame的内容很慢,还是我做错了?


下一篇:用Java画线