我最近使用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.有时它可能比正确答案大几十倍。
有谁知道为什么会这样?面积计算有问题吗?任何建议将不胜感激!
答案 0 :(得分:0)
根据此Wiki,您的代码未正确实现该方法。你的polyArea()方法忘记关闭多边形(它不考虑 last 到第一个顶点的行)。
此外,您的公式版似乎已经交换了p1和p2,虽然我不确定这是否有问题,但我个人并不了解 这种方法是如何工作的。