首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

N个点是否能构成一个凸多边形,该如何解决

2012-03-31 
N个点是否能构成一个凸多边形一道计算几何类的题目:输入N个点的坐标,由程序判断该N个点是否能构成一个凸多

N个点是否能构成一个凸多边形
一道计算几何类的题目:输入N个点的坐标,由程序判断该N个点是否能构成一个凸多边形。
希望找到这道题目及其解答的出处,例如某本书或某篇文章中,希望知道的朋友能够告诉我。

[解决办法]
先找凸包再看点都在凸包上么
在的话就是可以
有任何点不在就不可以
[解决办法]
你看一下如果减少一个或几个点后多边形的面积如果比原多边形的面积大,原来的肯定不是凸多边形
[解决办法]
判断所有连续的3个点是否同顺时针或逆时针
[解决办法]
http://zhidao.baidu.com/question/43293200
[解决办法]
可以根据凹多边形和凸多边形的定义来做:任意相邻两点连线,如果其它所有的点都在这条线的同侧就是凸多边形,否则为凹多边形。
[解决办法]
原来是要证明啊
如果是计算的话按照一个方向对相邻两条边向量做叉积(有向的,都是顺时针或者都是逆时针),如果所有结果都同号,就是凸多边形。这个是目前我知道的最快的方法,只需要2n次乘法n次减法
[解决办法]

C/C++ code
//判定凸多边形,顶点按顺时针或逆时针给出,允许相邻边共线int is_convex(int n,point* p){    int i,s[3]={1,1,1};    for (i=0;i<n&&s[1]|s[2];i++)        s[_sign(xmult(p[(i+1)%n],p[(i+2)%n],p[i]))]=0;    return s[1]|s[2];}//判定凸多边形,顶点按顺时针或逆时针给出,不允许相邻边共线int is_convex_v2(int n,point* p){    int i,s[3]={1,1,1};    for (i=0;i<n&&s[0]&&s[1]|s[2];i++)        s[_sign(xmult(p[(i+1)%n],p[(i+2)%n],p[i]))]=0;    return s[0]&&s[1]|s[2];}
[解决办法]
不用找出全部凸包,在找凸包的过程中就可以解决了,也许找那么2、3个点,就可以判断不成立了。
[解决办法]
探讨
谢谢yuerzm的代码,我已有实现代码,就想找个引用出处,这不是文章的重点,不想花精力证明它,有出处直接用就方便了,

[解决办法]
是按照输入点的顺序考虑吗?要是这样的话就很简单了啊

[解决办法]
探讨
原来是要证明啊
如果是计算的话按照一个方向对相邻两条边向量做叉积(有向的,都是顺时针或者都是逆时针),如果所有结果都同号,就是凸多边形。这个是目前我知道的最快的方法,只需要2n次乘法n次减法

[解决办法]
凸包算法的意义是,除了算出凸包本身以外,凸包上的点也是按顺序给出的。
如果点已经按顺序给出了,那这题没意义。如果点是随机顺序,那11L的扫描算法是不对的。
写论文的话nlogn的凸包足矣。省个常数屁用都没。

热点排行