回 帖 发 新 帖 刷新版面

主题:验证输入的点是否可以构成凸多边形

求解:
输入 n个点的坐标,编程验证可否构成凸多边形;
我觉得这个题目可以这样做:遍历所有可能的点顺序,每次检验是否构成凸多边形,用每个内角都小于180度来验证.若至少有一种可以,则成功.
问题在于如何遍历所有可能顺序.
请问大家有好的解法吗???

回复列表 (共2个回复)

沙发

凸多边形按顺时针走每条边看成向量,如果有两临两个向量的夹角小于0,则是凹多边形. 呵呵,我忘了向量夹角的定义了,也可能不是'0'吧,反正是这个意思:-).

板凳

一个一维凸包问题
可以先找出 点集S中 y值最小的一个点 P(X,Y) 然后根据其他点和P 的连线和x轴的夹角大小排序下
 夹角可以用cos算
  比如 cos∮=(Xi-X)/sprt((Yi-Y)*(Yi-Y)+(Xi-X)*(Xi-X));
然后按 cos∮的值大小把点排序 S={P,P1,P2,.....,Pi..}
接着开始扫描S 如果其中相继的3个点 构成右旋 那么就不能构成凸多边形
如果扫描到最后多是左旋 那么就能够成凸多边形.
判断p1,p2,p3是左旋还是右旋 如果求出行列式
x1,x2,x3
y1,y2,y3
1 , 1, 1
大于0 则左旋,既点p3在向量<p1,p2> 的左边
小于0 则右旋,既点p3在向量<p1,p2> 的右边
复杂度 O(NlogN)



我来回复

您尚未登录,请登录后再回复。点此登录或注册