开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 647|回复: 5
收起左侧

[易语言] 问个排序问题

[复制链接]
结帖率:70% (33/47)
发表于 2024-5-9 09:32:56 | 显示全部楼层 |阅读模式   辽宁省朝阳市
100精币
就我有很多坐标,基本就是一个长方形,我想让他顺时针排序或者逆时针都行,求个这样的算法,
就比如(1.1)(1,4)(4,1)(4,4)(4,3)(1,2)还有一些。。。
排序成(1,1)(1,2)(1,4)(3,4)(4,4)(4,1)这个就是逆时针排的,哪位大佬能帮个忙弄一个感谢


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳

签到天数: 19 天

发表于 2024-5-9 09:47:01 | 显示全部楼层   河北省张家口市
如果只是一个象限的话, 以0,0为原点, 计算每个点坐标与原点的角度, 然后对角度大小进行排序, 对应的就是坐标顺序了
回复

使用道具 举报

签到天数: 24 天

发表于 2024-5-9 10:08:59 | 显示全部楼层   重庆市重庆市
分哪种情况,极角排序、质心/重心排序、单向漫水排序(单像素图坐标)

补充内容 (2024-5-9 10:11):
漫水暂时不说,如果是线性坐标组:极角排序;闭合型/环形:重心排序。使用向量叉积即可:

.版本 2

.子程序 LQS点_叉积, 整数型, 公开, 向量:相对...
回复

使用道具 举报

签到天数: 24 天

发表于 2024-5-9 10:11:54 | 显示全部楼层   重庆市重庆市
asasqwwq 发表于 2024-5-9 10:08
分哪种情况,极角排序、质心/重心排序、单向漫水排序(单像素图坐标)

补充内容 (2024-5-9 10:11):

.版本 2

.子程序 LQS点_叉积, 整数型, 公开, 向量:相对于起点p0(x0,y0),则p0p1和p0p2的叉积为(p1-p0)×(p2-p0) = (x1-x0)(y2-y0)-(x2-x0)(y1-y0)。若结果为负,p0p2在p0p1的逆时针方向(p1前点、p0中间点、p2后点/凸点),在p1处左转; 结果为正则右转; 为0表示三点共线
.参数 起点, 坐标, , 向量共起点
.参数 终点1, 坐标, , 向量1终点
.参数 终点2, 坐标, , 向量2终点

返回 ((终点1.x - 起点.x) × (终点2.y - 起点.y) - (终点2.x - 起点.x) × (终点1.y - 起点.y))
[e=0][/e]

回复

使用道具 举报

签到天数: 24 天

发表于 2024-5-9 10:13:05 | 显示全部楼层   重庆市重庆市
asasqwwq 发表于 2024-5-9 10:11
.版本 2

.子程序 LQS点_叉积, 整数型, 公开, 向量:相对于起点p0(x0,y0),则p0p1和p0p2的叉积为(p1-p0) ...
  
子程序名返回值类型公开备 注
LQS坐标组_极角排序_坐标 可独立使用,不用添加变量“轮廓点集”
参数名类 型参考可空数组备 注
参_坐标坐标对坐标点集进行排序。根据向量叉积的定义,向量OPi和OPj的叉积大于0,则向量OPj在向量OPi的逆时针方向,即点Pj小于点Pi。
反向排序逻辑型
变量名类 型静态数组备 注
i整数型 
总数整数型 
j整数型 
顶点坐标1
如果真 (取数组成员数 (参_坐标) ≤ 0)
' 调试输出 (“没有排序成员。”)
返回 ()
顶点 [1] = 参_坐标 [1]
j = 1
计次循环首 (取数组成员数 (参_坐标), i)
判断 (顶点 [1].y > 参_坐标 [i].y)
顶点 [1] = 参_坐标 [i]
j = i
判断 (顶点 [1].y = 参_坐标 [i].y)
如果真 (顶点 [1].x > 参_坐标 [i].x)
顶点 [1] = 参_坐标 [i]
j = i




计次循环尾 ()
删除成员 (参_坐标, j, 1)
总数 = 取数组成员数 (参_坐标)
如果 (反向排序)
计次循环首 (总数 - 1, i)
计次循环首 (总数 - i, j)
判断 (LQS点_叉积 (顶点 [1], 参_坐标 [j], 参_坐标 [j + 1]) > 0)
交换变量 (参_坐标 [j], 参_坐标 [j + 1])
判断 (LQS点_叉积 (顶点 [1], 参_坐标 [j], 参_坐标 [j + 1]) = 0)
如果真 (参_坐标 [j].x < 参_坐标 [j + 1].x)
交换变量 (参_坐标 [j], 参_坐标 [j + 1])




计次循环尾 ()
计次循环尾 ()

计次循环首 (总数 - 1, i)
计次循环首 (总数 - i, j)
判断 (LQS点_叉积 (顶点 [1], 参_坐标 [j], 参_坐标 [j + 1]) < 0)
交换变量 (参_坐标 [j], 参_坐标 [j + 1])
判断 (LQS点_叉积 (顶点 [1], 参_坐标 [j], 参_坐标 [j + 1]) = 0)
如果真 (参_坐标 [j].x < 参_坐标 [j + 1].x)
交换变量 (参_坐标 [j], 参_坐标 [j + 1])




计次循环尾 ()
计次循环尾 ()

加入成员 (顶点, 参_坐标)
参_坐标 = 顶点
子程序名返回值类型公开备 注
LQS坐标组_极角重心排序_坐标 LQS写,主要用于环形点集排序。  可独立使用,不用添加变量“轮廓点集”
参数名类 型参考可空数组备 注
参_坐标坐标对坐标点集进行排序。根据向量叉积的定义,向量OPi和OPj的叉积大于0,则向量OPj在向量OPi的逆时针方向,即点Pj小于点Pi。
反向排序逻辑型
变量名类 型静态数组备 注
i整数型 
总数整数型 
j整数型 
顶点坐标1
临时成员数整数型 
X和整数型 
Y和整数型 
如果真 (取数组成员数 (参_坐标) ≤ 0)
' 调试输出 (“没有排序成员。”)
返回 ()
' ==========================
临时成员数 = 取数组成员数 (参_坐标)
计次循环首 (临时成员数, i)
X和 = X和 + 参_坐标 [i].x
Y和 = Y和 + 参_坐标 [i].y
计次循环尾 ()
顶点 [1].x = 到整数 (X和 ÷ 临时成员数)
顶点 [1].y = 到整数 (Y和 ÷ 临时成员数)
' ==========================
总数 = 取数组成员数 (参_坐标)
如果 (反向排序)
计次循环首 (总数 - 1, i)
计次循环首 (总数 - i, j)
判断 (LQS点_叉积 (顶点 [1], 参_坐标 [j], 参_坐标 [j + 1]) > 0)
交换变量 (参_坐标 [j], 参_坐标 [j + 1])
判断 (LQS点_叉积 (顶点 [1], 参_坐标 [j], 参_坐标 [j + 1]) = 0)
如果真 (参_坐标 [j].x < 参_坐标 [j + 1].x)
交换变量 (参_坐标 [j], 参_坐标 [j + 1])




计次循环尾 ()
计次循环尾 ()

计次循环首 (总数 - 1, i)
计次循环首 (总数 - i, j)
判断 (LQS点_叉积 (顶点 [1], 参_坐标 [j], 参_坐标 [j + 1]) < 0)
交换变量 (参_坐标 [j], 参_坐标 [j + 1])
判断 (LQS点_叉积 (顶点 [1], 参_坐标 [j], 参_坐标 [j + 1]) = 0)
如果真 (参_坐标 [j].x < 参_坐标 [j + 1].x)
交换变量 (参_坐标 [j], 参_坐标 [j + 1])




计次循环尾 ()
计次循环尾 ()

加入成员 (顶点, 参_坐标)
删除成员 (顶点, 1, 1)
参_坐标 = 顶点


参考用...................................................
回复

使用道具 举报

结帖率:95% (18/19)

签到天数: 13 天

发表于 2024-5-9 11:26:07 | 显示全部楼层   四川省成都市
[JavaScript] 纯文本查看 复制代码
.版本 2
.程序集 程序集1
.子程序 坐标排序, , 公开
    .参数 坐标数组,二维数组,引用,要排序的坐标数组
    .参数 方向,文本型,可空,排序的方向,"顺时针" 或 "逆时针"
    .局部变量 排序后的坐标,二维数组,, 排序后的坐标数组
    .局部变量 i,整数型,, 循环变量
    .局部变量 极角,实数型,, 用于计算坐标与原点的极角
    .局部变量 临时坐标,二维数组,, 临时存储坐标
    .局部变量 原点,二维数组,, 原点坐标 (0,0)

    .如果 (方向 = "逆时针")
        .计次循环 (取数组成员数(坐标数组),i)
            极角 = ATan(坐标数组[1] / 坐标数组[0])
            如果 (坐标数组[0] < 0)
                极角 = 极角 + 3.14159265
            临时坐标 = [极角,坐标数组]
        结束循环
    .否则
        .计次循环 (取数组成员数(坐标数组),i)
            极角 = ATan(坐标数组[1] / 坐标数组[0])
            如果 (坐标数组[0] < 0 且 坐标数组[1] >= 0)
                极角 = 极角 + 6.28318531
            如果 (坐标数组[0] < 0 且 坐标数组[1] < 0)
                极角 = 极角 + 3.14159265
            临时坐标 = [极角,坐标数组]
        结束循环
    .如果结束

    .对 临时坐标 按 第1个元素 用 极角 排序

    .计次循环 (取数组成员数(临时坐标),i)
        排序后的坐标 = 临时坐标[2]
    结束循环

    .返回 (排序后的坐标)
.子程序结束


补充内容 (2024-5-9 11:27):
这个算法首先计算每个坐标与原点形成的极角,然后根据指定的方向调整极角的值,以确保逆时针排序时,负x轴的坐标极角会加上π,而顺时针排序...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表