问题描述:已知多边形点集C={P1,P2,...,PN},其排列顺序是杂乱,依次连接这N个点,无法形成确定的多边形,需要对点集C进行排序后,再绘制多边形。

点集排序过程中,关键在于如何定义点的大小关系。

以按逆时针排序为例,算法步骤如下:

定义:点A在点B的逆时针方向,则点A大于点B

1.计算点集的重心O,以重心作为逆时针旋转的中心点。

2.计算点之间的大小关系。

大小关系的计算,可由两种方法进行计算。

方法1:

以重心O作一条平行于X轴的单位向量OX,然后依次计算OPi和OX的夹角,根据夹角的大小,确定点之间的大小关系。

OPi和OX夹角越大,说明点Pi越小,如图所示。

方法2:

根据向量叉积的定义,向量OPi和OPj的叉积大于0,则向量OPj在向量OPi的逆时针方向,即点Pj小于点Pi。

依据方法2,多边形点集排序的代码如下:

 1 typedef struct Point
 2 {
 3     int x;
 4     int y;
 5 }Point;
 6 //若点a大于点b,即点a在点b顺时针方向,返回true,否则返回false
 7 bool PointCmp(const Point &a,const Point &b,const Point &center)
 8 {
 9     if (a.x >= 0 && b.x < 0)
10         return true;
11     if (a.x == 0 && b.x == 0)
12         return a.y > b.y;
13     //向量OA和向量OB的叉积
14     int det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y);
15     if (det < 0)
16         return true;
17     if (det > 0)
18         return false;
19     //向量OA和向量OB共线,以距离判断大小
20     int d1 = (a.x - center.x) * (a.x - center.x) + (a.y - center.y) * (a.y - center.y);
21     int d2 = (b.x - center.x) * (b.x - center.y) + (b.y - center.y) * (b.y - center.y);
22     return d1 > d2;
23 }
24 void ClockwiseSortPoints(std::vector<Point> &vPoints)
25 {
26     //计算重心
27     cv::Point center;
28     double x = 0,y = 0;
29     for (int i = 0;i < vPoints.size();i++)
30     {
31         x += vPoints[i].x;
32         y += vPoints[i].y;
33     }
34     center.x = (int)x/vPoints.size();
35     center.y = (int)y/vPoints.size();
36
37     //冒泡排序
38     for(int i = 0;i < vPoints.size() - 1;i++)
39     {
40         for (int j = 0;j < vPoints.size() - i - 1;j++)
41         {
42             if (PointCmp(vPoints[j],vPoints[j+1],center))
43             {
44                 cv::Point tmp = vPoints[j];
45                 vPoints[j] = vPoints[j + 1];
46                 vPoints[j + 1] = tmp;
47             }
48         }
49     }
50 }

参考资料:

http://blog.csdn.net/beyond071/article/details/5855171

http://stackoverflow.com/questions/6989100/sort-points-in-clockwise-order

【计算几何】多边形点集排序相关推荐

  1. 点集排序(快速排序)

    点集排序算法,首先是要定义单个点如何确定大小,它不像数字那样是一维的,点是一个二维,所以在定义点的时候要定义点如何比较大小. 点的大小一般来说,都是从左到右,从下到上的一个顺序,也就是说首先比较X方向 ...

  2. 【算法:数学】计算几何-多边形的重心

    转载:计算几何-多边形的重心 1. 1 累加和求重心 设平面上有N 个离散数据点( xi , yi ) ( i = 1, 2, ., n) , 其 多边形重心G( . x1, . y1) 为: 这是求 ...

  3. 计算几何——多边形和圆相交的面积

    汇总篇:计算几何汇总 原文地址:https://www.cnblogs.com/lxglbk/archive/2012/08/12/2634192.html 代码部分为个人原创 圆与多变形相交的面积 ...

  4. POJ 3855 计算几何·多边形重心

    思路: 多边形面积->任选一个点,把多边形拆成三角,叉积一下 三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3 多边形重心公式题目中有,套一下就好了 计算多边形重心方法: ...

  5. 计算几何 多边形的交与并

    /** 多边形的交,多边形的边一定是要按逆时针方向给出* 还要判断是凸包还是凹包,调用相应的函数* 面积并,只要和面积减去交即可*/ #include <bits/stdc++.h> us ...

  6. LISP多边形形心计算公式_计算几何-多边形重心公式

    这是求多边形最简单直观的方法.可以直接利用离散数据点的 x, y 坐标就能求图形重心. 但是缺陷在于没有对离散数据点所围图形做任何处理和分析 , 精度不够. 1. 2 算法一:在讲该算法时,先要明白下 ...

  7. 平面几何相关算法整理

    自己在项目中用到的一些平面几何问题,主要都是参考其他博主的文章写的,会附上原文链接,本文仅作简要介绍和附上实现代码,具体原理可由参考链接中查看. 目录 一.数据结构说明 二.判断线段是否相交 三.判断 ...

  8. 【计算几何】多边形交集

    问题描述:已知两个多边形Poly1和Poly2,分别由点集C1={P1,P2,...,Pm}和C2={Q1,Q2,...,Qn}表示,求这两个多边形的交集. 算法思想: 两个多边形相交后,其顶点要么是 ...

  9. 判断点集与多边形的位置关系

    判断点集与多边形的位置关系 点集与凸多边形 点集与一般性多边形 点集与凸多边形 点集或者是点与多边形位置关系无非就三种 点在多边形的内部 点在多边形的外部 点在多边形上 一般如果该多边形是凸的那么我们 ...

最新文章

  1. Java打印整数的二进制表示(代码与解析)
  2. wxWidgets:wxSpinCtrl类用法
  3. js 里面的键盘事件对应的键码
  4. [存储引擎基础知识]InnoDB与MyISAM的六大区别(非原创)
  5. 终于完全弄懂了KMP(个人理解篇)
  6. CSS中的position
  7. 简单谈谈js中的MVC
  8. python一次性输入3个数_python实现输入数字的连续加减方法
  9. Css内边距与外边距
  10. 软件工程(敏捷过程和极限编程)
  11. 14届数独-真题标准数独-Day 7-20220122
  12. 职场上做“独狼”注定失败
  13. 天馈线测试仪是什么?
  14. 计算机毕业设计Java医院管理系统(系统+源码+mysql数据库+Lw文档)
  15. 1. Java POI 读取、写入Excel(包括样式)的工具类Utils
  16. AutoMapper的配置方法
  17. 2021极术通讯-使用Arm-2D在Cortex-M芯片中实现图形界面
  18. 制作macOS Monterey启动U盘
  19. linux xenserver教程,XenServer常用命令
  20. java一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?

热门文章

  1. Wix 安装部署教程(十六) -- 自动生成多语言文件
  2. Error:依赖版本不一致
  3. 用C++对C++语法格式进行分析
  4. 树转换为二叉树小技巧
  5. Codeigniter 用户登录注册模块
  6. C#.net删除dataGridView中选中行并同时更新数据库
  7. [Teaching] [Silverlight] 用 Silverlight 一起開發Kuso小遊戲《捏氣泡》- 設計人員篇
  8. [转]基于Prototype,利用Canvas绘图实现的web流程图设计器(原型)
  9. [转]数据仓库,OLAP与数据挖掘之间的关系
  10. 为什么本地sqlservr.exe进程占用内存如此之大?