当您将一组钉子钉在木板上并用橡皮筋包住时,您会得到一个凸包。
您的任务(如果您决定接受)是找到给定2D点集的凸包。
一些规则:
- 作为函数编写,该点的列表坐标(任意格式)是参数
- 输出必须是顺时针或逆时针列出的凸包中的点列表,从任何一个开始
- 输出列表可以采用任何合理的格式,其中每个点的坐标都可以清楚地区分。(例如,不是一个模糊列表{0.1、1.3、4,...})
- 如果凸包的一段中的三个或更多点对齐,则输出中仅应保留两个极端
样本数据:
样品0
输入:
{{1, 1}, {2, 2}, {3, 3}, {1, 3}}
输出:
{{3, 3}, {1, 3}, {1, 1}}
(这些数字只是说明性的)
样品1
输入:
{{4.4, 14}, {6.7, 15.25}, {6.9, 12.8}, {2.1, 11.1}, {9.5, 14.9},
{13.2, 11.9}, {10.3, 12.3}, {6.8, 9.5}, {3.3, 7.7}, {0.6, 5.1}, {5.3, 2.4},
{8.45, 4.7}, {11.5, 9.6}, {13.8, 7.3}, {12.9, 3.1}, {11, 1.1}}
输出:
{{13.8, 7.3}, {13.2, 11.9}, {9.5, 14.9}, {6.7, 15.25}, {4.4, 14},
{2.1, 11.1}, {0.6, 5.1}, {5.3, 2.4}, {11, 1.1}, {12.9, 3.1}}
样品2
输入:
{{1, 0}, {1, 1}, {1, -1}, {0.68957, 0.283647}, {0.909487, 0.644276},
{0.0361877, 0.803816}, {0.583004, 0.91555}, {-0.748169, 0.210483},
{-0.553528, -0.967036}, {0.316709, -0.153861}, {-0.79267, 0.585945},
{-0.700164, -0.750994}, {0.452273, -0.604434}, {-0.79134, -0.249902},
{-0.594918, -0.397574}, {-0.547371, -0.434041}, {0.958132, -0.499614},
{0.039941, 0.0990732}, {-0.891471, -0.464943}, {0.513187, -0.457062},
{-0.930053, 0.60341}, {0.656995, 0.854205}}
输出:
{{1, -1}, {1, 1}, {0.583004, 0.91555}, {0.0361877, 0.803816},
{-0.930053, 0.60341}, {-0.891471, -0.464943}, {-0.700164, -0.750994},
{-0.553528, -0.967036}}
适用标准代码高尔夫球规则。没有临时几何库。较短的代码胜出。
编辑1
我们在这里寻找算法的答案,而不是像MatLab或Mathematica这样的凸壳探测器预编程例程
编辑2
回答评论和其他信息:
- 您可以假定输入列表中包含适合您的最小点数。但是,您必须确保正确处理对齐的(子)集。
- 您可能会在输入列表中找到重复的点
- 最大点数应仅受可用内存限制
- 关于“浮点数”:您需要能够处理示例中给出的带有十进制坐标的输入列表。您可以通过使用浮点表示来实现
。
2
我预计MATLAB将赢得这一殊荣。
—
Paul R
我们可以假设至少有3分吗?我们可以假设这些点是不同的吗?是否需要支持浮点坐标?
—
彼得·泰勒
@PeterTaylor该示例表明最后一个答案是正确的
—
John Dvorak
我们可以覆盖输入内容吗?
—
John Dvorak
一致地处理共线点的问题是存在舍入问题。我们应该允许犯错误。
—
约翰·德沃夏克