找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1960|回复: 3

[分享] [转]多边形点集排序--针对凸多边形,按逆时针方向进行排序

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-5-15 06:37:52 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
[ 本帖最后由 csharp 于 2014-5-15 09:46 编辑 ]\n\n[url=http://www.cnblogs.com/loveclumsybaby/p/3420795.html]http://www.cnblogs.com/loveclumsybaby/p/3420795.html[/url]

public static void ClockwiseSortPoints(List<Point3D> vPoints)
        {
            //计算重心
            Point3D center = new Point3D();
            double X = 0, Y = 0;
            for (int i = 0; i < vPoints.Count; i++) {
                X += vPoints[i].X;
                Y += vPoints[i].Y;
            }
            center.X = (int)X / vPoints.Count;
            center.Y = (int)Y / vPoints.Count;
            //冒泡排序
            for (int i = 0; i < vPoints.Count - 1; i++) {
                for (int j = 0; j < vPoints.Count - i - 1; j++) {
                    if (PointCmp(vPoints[j], vPoints[j + 1], center)) {
                        Point3D tmp = vPoints[j];
                        vPoints[j] = vPoints[j + 1];
                        vPoints[j + 1] = tmp;
                    }
                }
            }
        }

//若点a大于点b,即点a在点b顺时针方向,返回true,否则返回false
        static bool PointCmp(Point3D a, Point3D b, Point3D center)
        {
            if (a.X >= 0 && b.X < 0)
                return true;
            if (a.X == 0 && b.X == 0)
                return a.Y > b.Y;
            //向量OA和向量OB的叉积
            int det = Convert.ToInt32((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;
            //向量OA和向量OB共线,以距离判断大小
            double d1 = (a.X - center.X) * (a.X - center.X) + (a.Y - center.Y) * (a.Y - center.Y);
            double d2 = (b.X - center.X) * (b.X - center.Y) + (b.Y - center.Y) * (b.Y - center.Y);
            return d1 > d2;
        }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2020-6-12 15:55:15 | 显示全部楼层
谢谢,学习一下,最好在写个使用的例程,方便大家学习。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 104个

财富等级: 日进斗金

发表于 2020-12-2 10:47:30 | 显示全部楼层
这是个排序的好东西,留存备用。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-11-3 09:16:25 | 显示全部楼层
是个好的东西
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-24 14:43 , Processed in 0.396392 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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