matlab 点顺时针排序,按顺时针顺序对点排序?
小编典典
首先,计算中心点。然后使用任何喜欢的排序算法对点进行排序,但是使用特殊的比较例程来确定一个点是否小于另一个点。
您可以通过以下简单计算来检查相对于中心的点(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 (a.y - center.y >= 0 || b.y - center.y >=0),以确保具有x =
0和负y的点从与中心更远的点开始排序。如果您不在乎同一“小时”上的点顺序,则可以忽略此if语句,并始终返回a.y > b.y。
更正了第一个if语句,添加了-center.x和-center.y。
添加了第二个if语句(a.x - center.x < 0 && b.x - center.x >=
0)。很明显,它丢失了。由于某些检查是多余的,因此现在可以重新组织if语句。例如,如果第一个if语句中的第一个条件为false,则第二个if的第一个条件必须为true。但是,为了简化起见,我决定保留原样。无论如何,编译器很有可能会优化代码并产生相同的结果。
2020-07-28
matlab 点顺时针排序,按顺时针顺序对点排序?相关推荐
- Java更好的字符串排序(字母顺序+数字大小排序)
前端JS版排序 文章目录 目标实现排序效果 问题 思路 目标实现排序效果 2022.10.30 [修复之前整数掺杂小数的情况]调整适配 1.2.3.4栋 1.2.3.5栋情况,最新效果如下 问题 业务 ...
- JS更好的字符串排序(字母顺序+数字大小排序)
接之前写的java版 文章目录 实现效果 简介 代码如下 实现效果 2022.10.30 [修复之前整数掺杂小数的情况]调整适配 1.2.3.4栋 1.2.3.5栋情况,最新效果如下 简介 用原生的字 ...
- 排序算法之冒泡排序及鸡尾酒排序
目录 一.排序算法的分类 二.冒泡排序 1.原始的冒泡排序 2.改进一步的冒泡排序 3.更进一步的冒泡排序 三.鸡尾酒排序 四.完整测试代码 一.排序算法的分类 在介绍排序算法之前,我们先根据时间复杂 ...
- 3、约瑟夫问题的一种描述是:编号为1,2,……,n的n个人按顺时针方向坐一圈,每人持有一个密码(正整数)。一开始任选一个作为报数上限值m,从第一个开始顺时针自1开始顺序报数,报到m是停止报数。报m的人
题目: /* 3.约瑟夫问题的一种描述是: 编号为1,2,--,n的n个人按顺时针方向坐一圈,每人持有一个密码(正整数).一开始任选一个作为报数上限值m, 从第一个开始顺时针自1开始顺序报数 ...
- 将0~N打乱顺序,然后排序
2019独角兽企业重金招聘Python工程师标准>>> /*将0~N打乱顺序,然后排序*/#include <stdio.h> #include <stdlib.h ...
- 按id进行查找按名称进行排序_Excel工作表中如何按需要的顺序快速进行排序
在工作中,有时候需要经常对一组内容按一定的顺序来进行排序.如果每次都手动进行排序,会小号很多时间.因此可以将特定顺序添加到自定义序列中.有两种不同的操作方法可以来实现. 方法一 如图,现在有一列水果名 ...
- 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例
介绍 这个是在B站上看边看视频边做的笔记,这一章是GO语言的排序和查找 有golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例,具体请看[文章目录] 配套视频自 ...
- ①编写一个程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符。②集合A、B的差集③对分行输入的若干字符串按字典序(由小到大)进行排序并输出。
文章目录 ①编写一个程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符 ②集合A.B的差集 ③对分行输入的若干字符串按字典序(由小到大)进行排序并输出. ①编写一个程序,从 ...
- 题7.15:要求输入一个职工号,用折半查找法查找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。按职工号由小到大顺序排序,姓名顺序也随之调整
题目 本题是谭浩强<C程序设计课后习题>题7.15. 题目: 写几个函数: 1.输入10个职工的姓名和职工号. 2.按职工号由小到大顺序排序,姓名顺序也随之调整 3.要求输入一个职工号,用 ...
- 写几个函数: ①输入10个职工的姓名和职工号; ②按职工号由小到大顺序排序,姓名顺序也随之调整; ③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
写几个函数: ①输入10个职工的姓名和职工号: ②按职工号由小到大顺序排序,姓名顺序也随之调整: ③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名. #i ...
最新文章
- NLP通用模型诞生?一个模型搞定十大自然语言常见任务
- ubuntu 杀死进程命令
- DateTime时间格式转换为Unix时间戳格式
- pyqt5教程10:Widgets2组件
- linux命令crontab
- python类型转换、数值操作
- SAP Spartacus not found页面的显示触发机制 - ErrorPageTemplate
- “父母双学霸, 生娃是学渣”的科学解释是什么?
- pythondict函数_Python的dict()函数
- 虚拟环境--virtualenv
- 金三银四我带你去BAT面试现场,砥砺前行!
- 【学习笔记】莫队算法
- SpringBoot之安装H2数据库
- Oreilly的历史和公司概况
- C#实现百度地图附近搜索调用JavaScript函数
- 计算机画面隐藏重叠怎么分开,windows7计算机怎么设置打开窗口不重叠?
- 【第三篇:利用ChatGPT编写贪食蛇小游戏】
- C#:实现大图片压缩算法(附完整源码)
- C语言中,头文件和源文件的关系(转)
- php实现的单例模式