【发布时间】:2013-05-23 05:01:29
【问题描述】:
我正在寻找一种方法来找到面积最大的四边形。我已经计算了凸包点并按顺时针方向排序。我尝试了蛮力,但当然它太慢了。所以我在这里找到了最大三角形的算法:
How to find largest triangle in convex hull aside from brute force search
它看起来真的很好,所以我尝试重新制作它。我有一个函数,可以通过将任何四边形划分为两个三角形来计算它的面积(在这个函数中,我对输入点进行排序以确保我正在计算直角三角形)。这里是:
int n = convexHull.size();
int A = 0; int B = 1; int C = 2; int D = 3;
int bestA = A; int bestB = B; int bestC = C; int bestD = D;
while(true) { // loop A
while(true) { // loop B
while(true) { // loop C
while(quadrangleArea(A, B, C, D) <= quadrangleArea(A, B, C, (D+1)%n) ) { // loop D
D = (D+1)%n;
}
if(quadrangleArea(A, B, C, D) <= quadrangleArea(A, B, (C+1)%n, D) ) {
C = (C+1)%n;
continue;
}
else break;
}
if(quadrangleArea(A, B, C, D) <= quadrangleArea(A, (B+1)%n, C, D) ) {
B = (B+1)%n;
continue;
}
else break;
}
if(quadrangleArea(A, B, C, D) > quadrangleArea(bestA, bestB, bestC, bestD) ) {
bestA = A; bestB = B; bestC = C; bestD = D;
}
A = (A+1)%n;
if (A==B) B = (B+1)%n;
if (B==C) C = (C+1)%n;
if (C==D) D = (D+1)%n;
if (A==0) break;
}
对于我的简单测试来说,它看起来不错并且给出了很好的结果,但恐怕有些地方不对劲。进一步推理,我可以为每个具有 n 个顶点的多边形制作算法——但凭直觉,我认为这是不可能的。我说的对吗?
我正在尝试解决 spoj 上的 "SHAMAN" 问题,但我得到了错误的答案。我 99% 确定我的程序的其余部分没问题,所以上面的代码有问题。你能帮我改进一下吗?也许你有一些棘手的测试可以证明这个算法不能正常工作?如有任何提示,我将不胜感激!
【问题讨论】:
-
您应该查看引用的 Dobkin 论文 ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=4567996。他们处理高阶多边形,但似乎无法证明除三角形以外的算法。
标签: c++ algorithm geometry computational-geometry