繁体   English   中英

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

[英]Convert from java.awt.geom.Area to java.awt.Polygon

我需要将java.awt.geom.Areajava.awt.Shape转换为java.awt.Polygon 我所知道的是: isSingular = trueisPolygonal = 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坐标)是微不足道的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM