高手看过来:如何判断一组点的排列方向

BEN1978 2005-06-13 12:58:45
有一组点,按照顺时针或者逆时针排序,
但是不知道到底是顺时针还是逆时针排序。
只知道点的xy坐标值。

有没有什么方法可以判断?

注:这组点构成闭合曲线框。
...全文
252 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
defyer007 2005-06-16
  • 打赏
  • 举报
回复
如果是极坐标就更好,那样的话就可以直接看角度的值
defyer007 2005-06-14
  • 打赏
  • 举报
回复
如果能够知道这条线的函数表达式就好了
然后划分不同的递增和递减区间
improgrammer 2005-06-14
  • 打赏
  • 举报
回复
happy__888([顾问团]寻开心) 的方法经典。
sanhill 2005-06-14
  • 打赏
  • 举报
回复
这组点构成闭合曲线框 存不存在着 象月牙似的 情况啊,如果存在的话,因为闭合,所以肯定存在一段曲线走的方向是顺时针的,一段方向是逆时针的,那么这组点到底是算顺时针还是逆时针呢?

如果不存在这样的情况,没有凹进去的话,bidongliang_2000() 和 happy__888 的方法可以借鉴。
寻开心 2005-06-14
  • 打赏
  • 举报
回复
除非你的模型有特殊性,否则找不到更快的办法的
你如果有办法快速找到一个凸点,只对凸点和它周围两点计算凸凹就可以了

凸点可以通过对顶点排序,找到最大(或者最小)的x(或者y)分量的点,并且该点的y(或者x)分量是x(或者y)最大(或者最小)点当中的最大(或者最小)的一个。
这个计算只要循环一遍所有的顶点,然后进行比较判断就可以了
比如
minx = x[0], miny=y[];
index = 0;
for ( int i=1; i<n; i++ )
{
if ( minx > x[i] ) continue;
if ( miny > y[i] ) continue;
index = i;
minx = x[i]; miny=y[i];
}
当这个循环结束的时候,第index-1, index, index+1三个点构成的三角形的顺逆就可以代表整个多边形的顺逆了。判断三角形的顺逆方法也是用面积来计算就可以了。
huangshusheng 2005-06-14
  • 打赏
  • 举报
回复
不是的.....这个吗?有一点难啊.......主要是点太多了啊.......你可以用函数吗?

去计算一下吗?
wytianjiao 2005-06-14
  • 打赏
  • 举报
回复
晕啊,计算每个点与原点连接后夹角的三角函数就行了,怎么都那么麻烦呢?
这个有什么难吗?
不过要是有省空间的方法最好了……
BEN1978 2005-06-13
  • 打赏
  • 举报
回复
点数比较多的话,如果用面积法,计算量好像非常大,

大概有上千个点
寻开心 2005-06-13
  • 打赏
  • 举报
回复
另外的一个办法是找到一个凸点(不过找凸点的计算量不必计算面积公司的量小)
然后判断凸点和它左右两个点组成的三角形的顺序是顺还是逆就可以了
三角形的顺逆可以用上面的面积法判定,也可以判定另外一个点位于边的上下的方法
寻开心 2005-06-13
  • 打赏
  • 举报
回复
可以用下面的的方法来计算

假定顶点的坐标是 x[i],y[i]
那么使用面积计算公式

s = 0;
for ( i=0; i<n; i++ )
s += x[i]*y[(i+1)%n] - x[(i+1)%n]*y[i];
s = s * 0.5;
如果s的数值是负数表示是逆时针排列,否则就是顺时针排列
bidongliang_2000 2005-06-13
  • 打赏
  • 举报
回复
设有N个点,用后面的点坐标依次减前面的点的坐标,最后一个用第一个减,得N条向量.分别求出它们幅角([0,2pi]中取值),相加之后大于零的为顺时针.
goodgoodwork 2005-06-13
  • 打赏
  • 举报
回复
你在具体说说。点没有方向怎么判断啊?还是闭合的。

65,170

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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