我正在尝试解决一个对我来说相当困难的问题。我不是编程新手,但我真的不知道如何解决这个问题。输入一组带有Xi和Yi坐标的点(点[]),程序必须输出多边形凸包的周长,但如果必要,它可以将凸包分成两部分,两个单独的凸包,每个凸包都包含若干点。这种划分的目的是为了使周长更短(如果这两个凸包的周长之和比一个凸包的周长更短;例如:两个远离彼此的点簇)。问题还在于不能有超过两个的凸包。我会感激任何想法。
这里有一个简单的问题说明(可能会有更多的点)。在这里,您可以看到两个分离的凸包的周长比一个凸包的周长更短。
补充:实际上,“周长”指的是周长。
以下是我的代码的关键部分:
这里有一个简单的问题说明(可能会有更多的点)。在这里,您可以看到两个分离的凸包的周长比一个凸包的周长更短。
![enter image description here](https://istack.dev59.com/6gWE6.webp)
以下是我的代码的关键部分:
m.x = (a.x + b.x)/2;
m.y = (a.y + b.y)/2;
ab.first = b.x - a.x;
ab.second = b.y - a.y;
for (i=0; i<n; ++i)
{
if (p[i].x * ab.first + p[i].y * ab.second - (SQ(ab.second) + SQ(ab.first))/2 > 0)
left[l++]=p[i];
else if (p[i].x * ab.first + p[i].y * ab.second - (SQ(ab.second) + SQ(ab.first))/2 < 0)
right[r++]=p[i];
if (p[i].x * ab.first + p[i].y * ab.second - (SQ(ab.second) + SQ(ab.first))/2 == 0)
mid[md++]=p[i];
}
hull1 + hull2 < big hull
? - sdasdadas<===>
可以分成<
和>
,这表明断开两个最大的非相邻边可能会起作用。 - andrew cooke