【计算几何】多边形点集排序
问题描述:已知多边形点集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 ¢er) 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
【计算几何】多边形点集排序相关推荐
- 点集排序(快速排序)
点集排序算法,首先是要定义单个点如何确定大小,它不像数字那样是一维的,点是一个二维,所以在定义点的时候要定义点如何比较大小. 点的大小一般来说,都是从左到右,从下到上的一个顺序,也就是说首先比较X方向 ...
- 【算法:数学】计算几何-多边形的重心
转载:计算几何-多边形的重心 1. 1 累加和求重心 设平面上有N 个离散数据点( xi , yi ) ( i = 1, 2, ., n) , 其 多边形重心G( . x1, . y1) 为: 这是求 ...
- 计算几何——多边形和圆相交的面积
汇总篇:计算几何汇总 原文地址:https://www.cnblogs.com/lxglbk/archive/2012/08/12/2634192.html 代码部分为个人原创 圆与多变形相交的面积 ...
- POJ 3855 计算几何·多边形重心
思路: 多边形面积->任选一个点,把多边形拆成三角,叉积一下 三角形重心->(x1+x2+x3)/3,(y1+y2+y3)/3 多边形重心公式题目中有,套一下就好了 计算多边形重心方法: ...
- 计算几何 多边形的交与并
/** 多边形的交,多边形的边一定是要按逆时针方向给出* 还要判断是凸包还是凹包,调用相应的函数* 面积并,只要和面积减去交即可*/ #include <bits/stdc++.h> us ...
- LISP多边形形心计算公式_计算几何-多边形重心公式
这是求多边形最简单直观的方法.可以直接利用离散数据点的 x, y 坐标就能求图形重心. 但是缺陷在于没有对离散数据点所围图形做任何处理和分析 , 精度不够. 1. 2 算法一:在讲该算法时,先要明白下 ...
- 平面几何相关算法整理
自己在项目中用到的一些平面几何问题,主要都是参考其他博主的文章写的,会附上原文链接,本文仅作简要介绍和附上实现代码,具体原理可由参考链接中查看. 目录 一.数据结构说明 二.判断线段是否相交 三.判断 ...
- 【计算几何】多边形交集
问题描述:已知两个多边形Poly1和Poly2,分别由点集C1={P1,P2,...,Pm}和C2={Q1,Q2,...,Qn}表示,求这两个多边形的交集. 算法思想: 两个多边形相交后,其顶点要么是 ...
- 判断点集与多边形的位置关系
判断点集与多边形的位置关系 点集与凸多边形 点集与一般性多边形 点集与凸多边形 点集或者是点与多边形位置关系无非就三种 点在多边形的内部 点在多边形的外部 点在多边形上 一般如果该多边形是凸的那么我们 ...
最新文章
- Java打印整数的二进制表示(代码与解析)
- wxWidgets:wxSpinCtrl类用法
- js 里面的键盘事件对应的键码
- [存储引擎基础知识]InnoDB与MyISAM的六大区别(非原创)
- 终于完全弄懂了KMP(个人理解篇)
- CSS中的position
- 简单谈谈js中的MVC
- python一次性输入3个数_python实现输入数字的连续加减方法
- Css内边距与外边距
- 软件工程(敏捷过程和极限编程)
- 14届数独-真题标准数独-Day 7-20220122
- 职场上做“独狼”注定失败
- 天馈线测试仪是什么?
- 计算机毕业设计Java医院管理系统(系统+源码+mysql数据库+Lw文档)
- 1. Java POI 读取、写入Excel(包括样式)的工具类Utils
- AutoMapper的配置方法
- 2021极术通讯-使用Arm-2D在Cortex-M芯片中实现图形界面
- 制作macOS Monterey启动U盘
- linux xenserver教程,XenServer常用命令
- java一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
热门文章
- Wix 安装部署教程(十六) -- 自动生成多语言文件
- Error:依赖版本不一致
- 用C++对C++语法格式进行分析
- 树转换为二叉树小技巧
- Codeigniter 用户登录注册模块
- C#.net删除dataGridView中选中行并同时更新数据库
- [Teaching] [Silverlight] 用 Silverlight 一起開發Kuso小遊戲《捏氣泡》- 設計人員篇
- [转]基于Prototype,利用Canvas绘图实现的web流程图设计器(原型)
- [转]数据仓库,OLAP与数据挖掘之间的关系
- 为什么本地sqlservr.exe进程占用内存如此之大?