判断多边形边界曲线顺/逆时针 两种方法
方法一:Green公式
Green公式揭示了平面区域的二重积分和封闭曲线上的线积分的关系。
其中L+表示沿着封闭区域的边界曲线正向。
并且由Green公式的推导过程我们知道:
这里若L=-y,可以保证(1)式子在区域中恒正,且等于封闭区域面积。
同理,M=x,也可以保证(2)式子在区域中恒正,且等于封闭区域面积。
所以我们只需沿着多边形的边求曲线积分,若积分为正,则是沿着边界曲线正方向(逆时针),反之为顺时针,且所得绝对值为多边形面积。
NOTE:边界曲线的正向即沿着边界曲线,单连通区域总在边界曲线的左边。(这里边界曲线正向,即我们所看到的逆时针方向)
这里假设我们程序中的多边形点为(x0,y0), (x1,y1), (x2,y2), . . . (xn-1,yn-1)
我们来计算沿着点(x0,y0), (x1,y1), (x2,y2), . . . (xn-1,yn-1)的曲线积分。
其中对于每段分割线段,y取( yn + yn+1) / 2 , dx=xn+1 - xn
d=0; for(int i=0;i<n-1;i++) {d+= -0.5*(y[i+1]+y[i])*(x[i+1]-x[i]); } if(d>0)std::cout<<"counter clockwise"<<std::endl; elsestd::cout<<"clockwise"<<std::endl;
方法二:端点判断
这个方法比较简单,遍历所有点,找到x最大的点Pm(该点一定在最右端曲线的“凸起”部分上),然后取该点前后各一个点Pm-1、Pm+1,组成向量(Pm-1,Pm)、(Pm,Pm+1)。然后进行向量叉乘即可判断出顺时针或逆时针。
如图,规定向量叉乘使用“右手定则”
+表示该点Pm和前后两个点组成的两个向量(Pm-1,Pm)、(Pm,Pm+1),叉乘得到的向量指向z轴负方向;
-表示(Pm-1,Pm)x(Pm,Pm+1)得到的向量指向z轴方向。
NOTE:这里必须进行遍历寻找凸点,否则若多边形含有凹的部分,并且选取的点于凹部分中,会得到相反的结果。
转载于:https://www.cnblogs.com/kyokuhuang/p/4250526.html
判断多边形边界曲线顺/逆时针 两种方法相关推荐
- javascript判断日期奇偶_JavaScript判断奇数和偶数的两种方法
JavaScript是前端开发中必不可少的一部分,那你知道如何用JS判断一个数是奇数还偶数吗?这篇文章就给大家分享JS判断奇数和偶数的两种方法,有一定的参考价值,感兴趣的朋友可以参考一下. 方法一:用 ...
- MSSQL 判断表是否存在的两种方法
SQL学习之查询技巧 查询表是否存在的两种方法 方法一 判断系统对象是否存在DECLARE@DbTableFileName VARCHAR(100)SET @DbTableFileName = 'tx ...
- Hunter’s Apprentice (猎人的学徒)——【Green 公式( 判断多边形边界曲线顺/逆时针】
学习博客:https://www.cnblogs.com/kyokuhuang/p/4250526.html 伪代码: double d = 0; for (int i = 0; i < n - ...
- vba判断文件是否存在的两种方法
方法1. 用VBA自带的dir()判断,代码如下: 在 Microsoft Windows 中, Dir 支持多字符 (*)和单字符 (?) 的通配符来指定多重文件 Function IsFileEx ...
- 关于 access 中如何使用 vba语言 判断表是否存在的两种方法
方法一: 通过循环,判断目标表是否存在 Function searchTable(TableName As String) As BooleansearchTable = False '默认不存在Di ...
- js判断数组中重复元素并找出_JavaScript判断数组重复内容的两种方法(推荐)
前言 一般,我们可能会给数组去重,这个操作并不复杂,执行一个循环就是了.现在,我要做的是,判断数组中是否有重复的内容,如果有,返回 true 否则,返回 false. 思路 把数组变成字符串 循环原数 ...
- 判断多边形边界曲线顺/逆时针
Green公式 double d = 0; for (int i = 0; i < n - 1; i++) {d += -0.5 * ( y[i + 1] + y[i]) * (x[i + 1] ...
- Python判断变量的数据类型的两种方法
2019独角兽企业重金招聘Python工程师标准>>> 1.isinstance(变量名,类型) def varargsql(self, sql, *args):if isinsta ...
- 判断是否是回文字符串两种方法
判断回文字符串的两种方法 public class JudgingPalindrome {public static void main(String[] args) {solution01();Sy ...
- JavaScript判断奇偶数的两种方法
这篇文章就给大家分享JS判断奇数和偶数的两种方法,感兴趣的朋友可以参考一下: 方法一:if else 双分支语句方式 描述:用if函数判断数字能否整除2,能则为偶,否则为奇,具体代码如下: var n ...
最新文章
- ie6 ie7 绝对定位 相对定位 层被遮住
- 【错误记录】编译 ijkplayer 报错 (fatal error: libyuv.h: No such file or directory #include “libyuv.h“ )
- asp.net使用for循环实现Datalist的分列显示功能
- 平均分辨准确率对网络隐藏层节点数的非线性变化关系03
- java检测ubuntu_在Ubuntu、Debian、CentOS Linux中检查Java版本的方法
- Luogu P3031 高于中位数
- [AGC031E] Snuke the Phantom Thief(网络流)
- C++从0到1的入门级教学(六)——函数
- 电子计算机和多媒体教材分析,人教新课标:电子计算机与多媒体教材分析
- (十三)linux中断底半部分处理机制
- 《剑指Offer》 旋转数组的最小数字
- 圣诞节海报设计还没开始?感受下合适的节日感PSD模板
- SpringBoot启动源码探究---getRunListener()
- 【TensorFlow-windows】(零)TensorFlow的安装
- 认识虚拟化(virtualization)
- 数学归纳法在数据结构与算法分析设计中的应用
- Idea修改字体颜色
- 7-8 阅览室 (20 point(s))
- matlab拟合出余弦曲线,如何用matlab做正弦曲线拟合?
- 用Android studio搭建沃商店SDK任意支付的配置