我正在尝试为我解决一个相当困难的问题。我对编程并不陌生,但我真的不知道如何解决这个问题。它给出了一组点 (point []),其中 Xi 和 Yi 坐标作为输入。程序必须输出多边形凸包的周长,但如果有必要,它可以将凸包分成两部分,两个独立的凸包,每个凸包都包含许多点。此划分的目标是具有更短的周长(如果这两个外壳的周长之和小于一个外壳的周长;例如:两个远离彼此的点簇)。问题还在于不能超过两个船体。我会很感激任何想法。
这个问题有一个简单的说明(可能还有很多点)。在这里,您可以看到两个分开的船体的周长比一个船体的周长短。
ADD:实际上,“周长”是指周长。
这是我的代码的关键部分:
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];
}