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

牛客练习赛18

链接: https://www.nowcoder.com/acm/contest/110/B
来源:牛客网

为了让所有选手都感到开心,Nowcoder练习赛总会包含一些非常基本的问题。 比如说:

按顺时针或逆时针方向给你一个简单的多边形的顶点坐标,请回答此多边形是顺时针还是逆时针。

输入描述:

输入包含N + 1行。
第一行包含一个整数N,表示简单多边形的顶点数。
在下面的N行中,第i行包含两个整数xi,yi,表示简单多边形中的第i个顶点的坐标。

输出描述:

如果简单多边形按顺时针顺序给出,则在一行中输出“clockwise”(不带引号)。 否则,打印"counterclockwise''(不带引号)。
#include<iostream>
using namespace std;
int x[35], y[35];
int main(){int N;cin >> N;for (int i = 0; i < N; i++)cin >> x[i] >> y[i];int 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)cout << "counterclockwise"<< endl;elsecout << "clockwise" << 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. 网络规划设计师考试命题模式持续在变   你变不变
  2. 洛谷P1373 小a和uim之大逃离
  3. 竞品分析框架及案例-探索业务方向
  4. 点击弹出窗口外任意地方关闭弹出窗口
  5. OneZero团队Beta发布剧透
  6. 多所高校通知,新学期延期开学!做好线上教学准备
  7. 鲲鹏云实验-.NET Core 3.0-开始使用
  8. 软件LoadRunner 产品信息(product information)
  9. Android Fragment(一)
  10. Apache Flink 在 bilibili 的多元化探索与实践
  11. 逗号表达式执行的顺序—从左到右
  12. Skype 去广告安装方法
  13. 两台局域网电脑共享文件及传输文件集锦
  14. python浪漫代码表白npy_【师大表白墙】表白wdl小姐姐,一眼看过去就记住的女孩子,笑起来时眼睛里有星星在闪烁~...
  15. 22湖南大学866数据结构真题(回忆版)
  16. Java邮箱正则匹配
  17. linux 将当前时间往后调整2分钟_linux调整系统时间 永久 z | 学步园
  18. 串口设备短信模块开发笔记
  19. 把Redis当作队列来用,真的合适吗?(转载)
  20. live555源代码分析

热门文章

  1. 电子设计教程39:软启动电路-观察浪涌电流
  2. 视频演示-Snapper快捷优秀的音频预览播放器演示
  3. linux at91看门狗驱动设置
  4. UVA 1518 Train delays
  5. 上海证券交易所云平台移动行情服务测试项目
  6. 如何实现对网站页面访问量的统计?
  7. CAS号:60535-02-6,二肽Met-Trp
  8. 如何设置计算机桌面待办事项,怎么在Windows电脑桌面便签上显示未来要处理的待办事项?...
  9. 文件大小单位换算(B-GB)
  10. 怎么计算中国股市分红最高的股票?什么是股息率?--使用python和tushare获取分红最高的股票