我需要用两条垂直线切割一个凸的非简单多边形,将其分成 4 个相等(面积)的部分。
我写了一个程序,但它没有通过测试。
- 我认为原因是舍入误差或我计算面积的函数。
- 请检查一下,是否正确?
- 我使用鞋带算法和苍鹭公式
这是代码:
double calcArea() {
double result = 0;
if (size() > 4) {
int j = size() - 1;
for (int i = 0; i < size() - 1; i++) {
result += (points.get(i).getX() + points.get(j).getX())
*
(points.get(j).getY() - points.get(i).getY());
j = i;
}
result = result / (result >= 0 ? 2. : -2.);
} else if(size() == 3) {
double c,a,b, p;
c = Math.sqrt(Math.pow(points.get(0).getY()-points.get(1).getY(),2)+Math.pow(points.get(0).getX()-points.get(1).getX(),2));
a = Math.sqrt(Math.pow(points.get(1).getY()-points.get(2).getY(),2)+Math.pow(points.get(1).getX()-points.get(2).getX(),2));
b = Math.sqrt(Math.pow(points.get(0).getY()-points.get(2).getY(),2)+Math.pow(points.get(0).getX()-points.get(2).getX(),2));
p = (a + b + c) / 2.;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
return result;
}
我在做什么:
- 寻找
point(x, y)
切割多边形。 - 我把它剪了
x = a in [ min(x), max(x)]
- 并计算
S'
(从 x=min(x) 到 x=a 的多边形的一部分) - 如果
S' = S/2
,我拿来a
计算价值(a, *)
- 然后与
y = b
where相同b in [min(y), max(y)]
- 有没有更快的方法?