首先计算中心点。

然后使用任何你喜欢的排序算法对点进行排序,但使用特殊的比较例程来确定一个点是否小于另一个点。

通过这个简单的计算,可以检查一个点(a)是否相对于中心位于另一个(b)的左边或右边:

det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y)

如果结果为零,则它们在中心的同一直线上,如果它是正的或负的,则它在一侧或另一侧,因此一个点将在另一个之前。

使用它可以构造一个小于的关系来比较点,并确定它们应该在排序数组中出现的顺序。但是你必须定义该顺序的开始,我的意思是开始的角度(例如x轴的正半)。

比较函数的代码如下所示:

bool less(point a, point b)

{

if (a.x - center.x >= 0 && b.x - center.x < 0)

return true;

if (a.x - center.x < 0 && b.x - center.x >= 0)

return false;

if (a.x - center.x == 0 && b.x - center.x == 0) {

if (a.y - center.y >= 0 || b.y - center.y >= 0)

return a.y > b.y;

return b.y > a.y;

}

// compute the cross product of vectors (center -> a) x (center -> b)

int det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y);

if (det < 0)

return true;

if (det > 0)

return false;

// points a and b are on the same line from the center

// check which point is closer to the center

int d1 = (a.x - center.x) * (a.x - center.x) + (a.y - center.y) * (a.y - center.y);

int d2 = (b.x - center.x) * (b.x - center.x) + (b.y - center.y) * (b.y - center.y);

return d1 > d2;

}

这将从12点开始顺时针顺序排列点。相同“小时”上的点将从离中心更远的点开始排序。

如果使用整数类型(这在Lua中不存在),你必须确保det,d1和d2变量是能够保存执行计算结果的类型。

如果你想实现一些看起来坚实,尽可能凸,那么我想你正在寻找一个Convex Hull.你可以使用Graham Scan计算。

在此算法中,您还必须从特殊枢轴点开始顺时针(或逆时针)排序点。然后你重复简单的循环步骤,每次检查是否向左或向右添加新的点到凸包,这个检查是基于交叉乘积就像在上面的比较函数。

编辑:

添加了一个if语句if(ay – center.y> = 0 || by – center.y> = 0),以确保具有x = 0和负y的点从进一步从中心。如果你不关心在同一’小时’点的顺序,你可以省略这个if语句,并总是返回a.y>通过。

通过添加-center.x和-center.y更正了第一个if语句。

添加了第二个if语句(a.x – center.x< 0& b.x - center.x> = 0)。这是一个明显的疏忽,它失踪了。 if语句现在可以重新组织,因为一些检查是多余的。例如,如果第一个if语句中的第一个条件为false,则第二个if的第一个条件必须为true。然而,我决定离开代码,因为它是为了简单。很可能编译器将优化代码并产生相同的结果。

matlab 点顺时针排序,算法 – 按顺时针顺序排序点?相关推荐

  1. java选择排序代码_Java排序算法总结之选择排序

    本文实例讲述了Java排序算法总结之选择排序.分享给大家供大家参考.具体分析如下: 选择排序的基本操作就是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部 ...

  2. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

  3. java 奇偶数据排序算法,简单讲解奇偶排序算法及在Java数组中的实现

    简单讲解奇偶排序算法及在Java数组中的实现 奇偶排序是一个比较有个性的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组 [6 2 4 1 5 9] ...

  4. 排序算法 - 面试中的排序算法总结

    排序算法总结 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不 ...

  5. Java常见排序算法之直接选择排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  6. php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码

    <script>ec(2);<script> php 常用的排序算法代码[冒泡,递归排序 冒泡排序算法 function bubblesort($arr) { $n=count ...

  7. 数据结构之排序算法:并归排序

    排序算法:并归排序 思维导图: 归并排序的定义: 俩个有序线性表的合并: 归并排序的代码实现: 归并排序的性能: 思维导图: 归并排序的定义: 俩个有序线性表的合并: int *B = (int *) ...

  8. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

  9. js排序算法详解-桶排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-桶排序 一看到这个名字就会觉得奇特,几个意思,我排序还要再准备几个桶不成?还真别说,想用桶排序还得真准备几个桶 ...

最新文章

  1. 面试官:不使用synchronized和lock,如何实现一个线程安全的单例?
  2. 微信小程序登录 getUserInfo:fail 登录用户不是该小程序的开发者
  3. strstr,strrchr,strpos,strrpos的区别http://blog.qit...
  4. python table类中的 可以作为初步观察工具_Python程序设计基础_课程2020最新章节测试网课课后答案...
  5. java 枚举可以循环吗_(转载)java 枚举 循环遍历以及一些简单常见的使用
  6. c#winform演练 ktv项目 制作歌曲播放列表
  7. centos 程序 mysql_Centos 源码安装 MySQL
  8. android图片加水印,文字
  9. SAP MM批次管理
  10. <2021SC@SDUSC> 开源游戏引擎 Overload 代码模块分析 之 OvTools(七)—— 终篇总结
  11. 手机+文件共享服务器软件,windows文件共享服务器软件
  12. 1-4课:程序、编程和算法之间到底有什么三角关系?
  13. 线性最优离散滤波器——维纳滤波器及LCMV MVDR GSC (自适应滤波)
  14. 光猫接交换机,交换机下接无线路由器,电脑网线连接交换机进不去无线路由器后台是为什么?
  15. gradle 离线模式offline 用法
  16. 泰山OFFICE技术讲座:WORD光标出错
  17. 有个空间,名叫 Gamma
  18. lucene(11)
  19. DCC:Deep continuous clustering
  20. inversion 矩阵_inversion是什么意思_inversion怎么读_inversion翻译_用法_发音_词组_同反义词_倒置-新东方在线英语词典...

热门文章

  1. 搭建Ubuntu的51单片机开发环境(学习记录)
  2. 什么会影响网站网页的打开速度
  3. Revit MEP 平面视图中(立管)怎么设置二维表达?
  4. js动态生成echarts图表,并生成图片保存到本地,自定义图片名。
  5. TFLearn初探之Activation与Dropout
  6. win10 linux 修复引导菜单,win10 + Ubuntu16.04双系统修复linux grub引导丢失
  7. 假如银行利率如下所示,请分别计算存款10000元,活期1年、活期2年、定期1年、定期2年后的本息合计。(结果四舍五入,不保留小数位。使用Math.round(double d)实现
  8. 开一个羽毛球馆有哪些支出?
  9. RTOS系统5-中断管理
  10. 自己收藏的百度地图批量描点获取坐标工具类