方法一: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

判断多边形边界曲线顺/逆时针 两种方法相关推荐

  1. javascript判断日期奇偶_JavaScript判断奇数和偶数的两种方法

    JavaScript是前端开发中必不可少的一部分,那你知道如何用JS判断一个数是奇数还偶数吗?这篇文章就给大家分享JS判断奇数和偶数的两种方法,有一定的参考价值,感兴趣的朋友可以参考一下. 方法一:用 ...

  2. MSSQL 判断表是否存在的两种方法

    SQL学习之查询技巧 查询表是否存在的两种方法 方法一 判断系统对象是否存在DECLARE@DbTableFileName VARCHAR(100)SET @DbTableFileName = 'tx ...

  3. Hunter’s Apprentice (猎人的学徒)——【Green 公式( 判断多边形边界曲线顺/逆时针】

    学习博客:https://www.cnblogs.com/kyokuhuang/p/4250526.html 伪代码: double d = 0; for (int i = 0; i < n - ...

  4. vba判断文件是否存在的两种方法

    方法1. 用VBA自带的dir()判断,代码如下: 在 Microsoft Windows 中, Dir 支持多字符 (*)和单字符 (?) 的通配符来指定多重文件 Function IsFileEx ...

  5. 关于 access 中如何使用 vba语言 判断表是否存在的两种方法

    方法一: 通过循环,判断目标表是否存在 Function searchTable(TableName As String) As BooleansearchTable = False '默认不存在Di ...

  6. js判断数组中重复元素并找出_JavaScript判断数组重复内容的两种方法(推荐)

    前言 一般,我们可能会给数组去重,这个操作并不复杂,执行一个循环就是了.现在,我要做的是,判断数组中是否有重复的内容,如果有,返回 true 否则,返回 false. 思路 把数组变成字符串 循环原数 ...

  7. 判断多边形边界曲线顺/逆时针

    Green公式 double d = 0; for (int i = 0; i < n - 1; i++) {d += -0.5 * ( y[i + 1] + y[i]) * (x[i + 1] ...

  8. Python判断变量的数据类型的两种方法

    2019独角兽企业重金招聘Python工程师标准>>> 1.isinstance(变量名,类型) def varargsql(self, sql, *args):if isinsta ...

  9. 判断是否是回文字符串两种方法

    判断回文字符串的两种方法 public class JudgingPalindrome {public static void main(String[] args) {solution01();Sy ...

  10. JavaScript判断奇偶数的两种方法

    这篇文章就给大家分享JS判断奇数和偶数的两种方法,感兴趣的朋友可以参考一下: 方法一:if else 双分支语句方式 描述:用if函数判断数字能否整除2,能则为偶,否则为奇,具体代码如下: var n ...

最新文章

  1. ie6 ie7 绝对定位 相对定位 层被遮住
  2. 【错误记录】编译 ijkplayer 报错 (fatal error: libyuv.h: No such file or directory #include “libyuv.h“ )
  3. asp.net使用for循环实现Datalist的分列显示功能
  4. 平均分辨准确率对网络隐藏层节点数的非线性变化关系03
  5. java检测ubuntu_在Ubuntu、Debian、CentOS Linux中检查Java版本的方法
  6. Luogu P3031 高于中位数
  7. [AGC031E] Snuke the Phantom Thief(网络流)
  8. C++从0到1的入门级教学(六)——函数
  9. 电子计算机和多媒体教材分析,人教新课标:电子计算机与多媒体教材分析
  10. (十三)linux中断底半部分处理机制
  11. 《剑指Offer》 旋转数组的最小数字
  12. 圣诞节海报设计还没开始?感受下合适的节日感PSD模板
  13. SpringBoot启动源码探究---getRunListener()
  14. 【TensorFlow-windows】(零)TensorFlow的安装
  15. 认识虚拟化(virtualization)
  16. 数学归纳法在数据结构与算法分析设计中的应用
  17. Idea修改字体颜色
  18. 7-8 阅览室 (20 point(s))
  19. matlab拟合出余弦曲线,如何用matlab做正弦曲线拟合?
  20. 用Android studio搭建沃商店SDK任意支付的配置

热门文章

  1. 关于Chrome浏览器(Chrome Stable、 Chrome Canary 、Chromium)
  2. Firefox for iOS 终于登陆中国
  3. 照片教你eclipse通过使用gradle 打包Android
  4. 玩Mega8 智能充电器-12. 终于实现-dV检测(转)
  5. 扩展DOM有什么问题
  6. discuz 任务扩展
  7. 请不要滥用SharedPreference
  8. 远程仓库之GitHub介绍
  9. zend studio 本地调试php,Zend Studio调试php教程
  10. 解决mysql编码问题_解决mysql乱码问题