使用带有Rectangle2D的java.awt.geom.Area时,区域结果不正确

时间:2012-08-09 15:47:48

标签: java area

我最近使用Java Area类来包装Rectangle2D.Double类型。所以我可以做交叉,添加等操作。但是,当涉及到形状区域的计算时,我得到了一个非常奇怪的结果。下面是我用来计算形状面积的代码:

private static double polyArea(ArrayList<Point2D.Double> pointList) {
    double area = 0;
    for (int loopi = 1; loopi < pointList.size(); loopi++) {
        Point2D.Double p1 = pointList.get(loopi - 1);
        Point2D.Double p2 = pointList.get(loopi);
        area += (p1.x * p2.y - p2.x * p1.y) / 2.0;
    }
    return area;
}

public  static double coverageArea(Shape s) {
    ArrayList<Point2D.Double> pointList = new ArrayList<Point2D.Double>();
    double[] coords = new double[6];
    int type;
    double totalArea = 0;
    PathIterator it = s.getPathIterator(null);
    while (!it.isDone()) {
        type = it.currentSegment(coords);
        if (type == it.SEG_MOVETO) {
            pointList.clear();
            pointList.add(new Point2D.Double(coords[0], coords[1]));
        } else if (type == it.SEG_LINETO) {
            pointList.add(new Point2D.Double(coords[0], coords[1]));
        } else if (type == it.SEG_CLOSE) {
            totalArea += polyArea(pointList);
            pointList.clear();
        } else {
            System.out.println("calculateShapeArea: Cannot calculate area for shapes with segment type other than SEG_MOVETO, SEG_LINETO, or SEG_CLOSE.  Ignoring segment type=" + type);
        }
        it.next();
    }
    if (totalArea < 0) {
        totalArea = -totalArea;
    }
    return totalArea;
}

如果我有一个Rectangle2D r(1.0,1.0,6.0,6.0),使用上面的代码我将正确得到该区域36.但是,如果我a = new Area(r),那么结果为{ {1}}是39.有时它可能比正确答案大几十倍。

有谁知道为什么会这样?面积计算有问题吗?任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

根据此Wiki,您的代码未正确实现该方法。你的polyArea()方法忘记关闭多边形(它不考虑 last 第一个顶点的行)。

此外,您的公式版似乎已经交换了p1和p2,虽然我不确定这是否有问题,但我个人并不了解 这种方法是如何工作的。