如何通过了解多边形的点来测试多边形 凸是否凸 与他们在c ++中的coordonates?
答案 0 :(得分:2)
对于多边形的每一边,计算线方程(Ax+By+C=0
)并检查(将x
和y
放入方程并得到它的符号),所有点都来自一侧它的。
修改强>: 如果行进凸多边形,您将始终在每个点上向一个方向(左或右)旋转。 使用交叉产品,您可以简单地推断出您将在下一轮转动的哪一侧(负面或正面)。如果三个连续点的所有叉积都具有相等的符号,则多边形是凸的。
答案 1 :(得分:1)
礼品包装算法是一种计算凸起的算法 一组给定点的船体。
来自wiki的伪代码:
jarvis(S)
pointOnHull = leftmost point in S
i = 0
repeat
P[i] = pointOnHull
endpoint = S[0] // initial endpoint for a candidate edge on the hull
for j from 1 to |S|-1
if (endpoint == pointOnHull) or
(S[j] is on left of line from P[i] to endpoint)
endpoint = S[j] // found greater left turn, update endpoint
i = i+1
pointOnHull = endpoint
until endpoint == P[0] // wrapped around to first hull point
如果您的点与上述算法的检测点匹配,则多边形为凸。
答案 2 :(得分:1)
使用任何常用算法找到凸包。当且仅当其所有顶点都属于其凸包时,多边形才是凸的。
这是O(n log n),但不依赖于在多边形边缘周围以正确顺序给出点的假设。如果假设为真,则仇恨引擎的答案是最优的(即线性时间。)