N个点是否能构成一个凸多边形

NikaAndRoger 2011-11-28 03:57:37
一道计算几何类的题目:输入N个点的坐标,由程序判断该N个点是否能构成一个凸多边形。
希望找到这道题目及其解答的出处,例如某本书或某篇文章中,希望知道的朋友能够告诉我。
...全文
611 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2011-12-28
  • 打赏
  • 举报
回复
凸包算法的意义是,除了算出凸包本身以外,凸包上的点也是按顺序给出的。
如果点已经按顺序给出了,那这题没意义。如果点是随机顺序,那11L的扫描算法是不对的。
写论文的话nlogn的凸包足矣。省个常数屁用都没。
FancyMouse 2011-12-28
  • 打赏
  • 举报
回复
凸包算法的意义是,除了算出凸包本身以外,凸包上的点也是按顺序给出的。
如果点已经按顺序给出了(如果的确是凸包的话),那这题没意义。如果点是随机顺序,那11L的扫描算法是不对的。
写论文的话nlogn的凸包足矣。省个常数屁用都没。
FancyMouse 2011-12-28
  • 打赏
  • 举报
回复
凸包算法的意义是,除了算出凸包本身以外,凸包上的点也是按顺序给出的。
如果点已经按顺序给出了,那这题没意义。如果点是随机顺序,那11L的扫描算法是不对的。
写论文的话nlogn的凸包足矣。省个常数屁用都没。
chen_q07 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 vichare 的回复:]
原来是要证明啊
如果是计算的话按照一个方向对相邻两条边向量做叉积(有向的,都是顺时针或者都是逆时针),如果所有结果都同号,就是凸多边形。这个是目前我知道的最快的方法,只需要2n次乘法n次减法
[/Quote]
这不就是最好的证明么。。。。代码也好写。
LucEaspe 2011-12-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 nikaandroger 的回复:]
谢谢yuerzm的代码,我已有实现代码,就想找个引用出处,这不是文章的重点,不想花精力证明它,有出处直接用就方便了,
[/Quote]证明很方便的。两点构成一个向量,两个向量的向量积的正负符合表示夹角,注意是哪个夹角。
ggzwtj 2011-12-21
  • 打赏
  • 举报
回复
是按照输入点的顺序考虑吗?要是这样的话就很简单了啊
NikaAndRoger 2011-12-19
  • 打赏
  • 举报
回复
谢谢yuerzm的代码,我已有实现代码,就想找个引用出处,这不是文章的重点,不想花精力证明它,有出处直接用就方便了,
绿色夹克衫 2011-12-04
  • 打赏
  • 举报
回复
不用找出全部凸包,在找凸包的过程中就可以解决了,也许找那么2、3个点,就可以判断不成立了。
acdbxzyw 2011-12-03
  • 打赏
  • 举报
回复
凸包问题。。。代码不会。
LucEaspe 2011-12-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yuerzm 的回复:]
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;
……
[/Quote]少了一些宏。。。
下面补上

#define _sign(x) ((x)>eps?1:((x)<-eps?2:0))
struct point{double x,y;};

double xmult(point p1,point p2,point p0){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

//判定凸多边形,顶点按顺时针或逆时针给出,允许相邻边共线
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];
}
LucEaspe 2011-12-03
  • 打赏
  • 举报
回复
//判定凸多边形,顶点按顺时针或逆时针给出,允许相邻边共线
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];
}
hezytop 2011-12-02
  • 打赏
  • 举报
回复
可以根据凹多边形和凸多边形的定义来做:任意相邻两点连线,如果其它所有的点都在这条线的同侧就是凸多边形,否则为凹多边形。
vivare 2011-12-02
  • 打赏
  • 举报
回复
原来是要证明啊
如果是计算的话按照一个方向对相邻两条边向量做叉积(有向的,都是顺时针或者都是逆时针),如果所有结果都同号,就是凸多边形。这个是目前我知道的最快的方法,只需要2n次乘法n次减法
wenzheng101 2011-11-30
  • 打赏
  • 举报
回复
http://zhidao.baidu.com/question/43293200
Usopp_Dream 2011-11-30
  • 打赏
  • 举报
回复
凸包问题,可以去算法入门经典那本书上看,计算几何那个章节
fire_woods 2011-11-29
  • 打赏
  • 举报
回复
1樓的很好證明.
Jokul_Lee 2011-11-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 cankoo 的回复:]

证明其正确性
[/Quote]+
cankoo 2011-11-29
  • 打赏
  • 举报
回复
证明其正确性
NikaAndRoger 2011-11-29
  • 打赏
  • 举报
回复
想找一个有出处的算法,我写一篇文章中要引用到,否则自己写还要证明其正确性
DavidGaku 2011-11-29
  • 打赏
  • 举报
回复
判断所有连续的3个点是否同顺时针或逆时针
加载更多回复(2)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧