判断多边形边界曲线顺/逆时针 两种方法
方法一: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
来源:牛客网
输入描述:
输入包含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
判断多边形边界曲线顺/逆时针 两种方法相关推荐
- 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 ...
最新文章
- 网络规划设计师考试命题模式持续在变 你变不变
- 洛谷P1373 小a和uim之大逃离
- 竞品分析框架及案例-探索业务方向
- 点击弹出窗口外任意地方关闭弹出窗口
- OneZero团队Beta发布剧透
- 多所高校通知,新学期延期开学!做好线上教学准备
- 鲲鹏云实验-.NET Core 3.0-开始使用
- 软件LoadRunner 产品信息(product information)
- Android Fragment(一)
- Apache Flink 在 bilibili 的多元化探索与实践
- 逗号表达式执行的顺序—从左到右
- Skype 去广告安装方法
- 两台局域网电脑共享文件及传输文件集锦
- python浪漫代码表白npy_【师大表白墙】表白wdl小姐姐,一眼看过去就记住的女孩子,笑起来时眼睛里有星星在闪烁~...
- 22湖南大学866数据结构真题(回忆版)
- Java邮箱正则匹配
- linux 将当前时间往后调整2分钟_linux调整系统时间 永久 z | 学步园
- 串口设备短信模块开发笔记
- 把Redis当作队列来用,真的合适吗?(转载)
- live555源代码分析
热门文章
- 电子设计教程39:软启动电路-观察浪涌电流
- 视频演示-Snapper快捷优秀的音频预览播放器演示
- linux at91看门狗驱动设置
- UVA	1518	 Train delays
- 上海证券交易所云平台移动行情服务测试项目
- 如何实现对网站页面访问量的统计?
- CAS号:60535-02-6,二肽Met-Trp
- 如何设置计算机桌面待办事项,怎么在Windows电脑桌面便签上显示未来要处理的待办事项?...
- 文件大小单位换算(B-GB)
- 怎么计算中国股市分红最高的股票?什么是股息率?--使用python和tushare获取分红最高的股票