判断一个多边形是顺时针还是逆时针的方法

1、关于如何判定多边形是顺时针还是逆时针对于凸多边形而言,只需对某一个点计算叉积 = ((xi - xi-1),(yi - yi-1)) x ((xi+1 - xi),(yi+1 - yi)) = (xi - xi-1) * (yi+1 - yi) - (yi - yi-1) * (xi+1 - xi)
如果上式的值为正,逆时针;为负则是顺时针。

而对于一般的简单多边形,则需对于多边形的每一个点计算上述值,如果正值比较多,是逆时针;负值较多则为顺时针。

2、还有一种说明是取多边形的极点值,多边形的方向和这个顶点与其相邻两边构成的方向相同。

需要注意的是在屏幕坐标中,Y是向下的,所以在屏幕坐标系中看到的顺时针既是在Y轴向上的直角坐标系中看到的逆时针方向。

1.凸包的时候,只要判断前三个点即可,计算叉积,判断方向

2.凹包情况就复杂了,可以从三个方面考虑

首先,可以去凸包上的特殊点,x最大最小的点,y最大最小的点,这些极值点肯定是在凸包上的,可以计算这些的叉积,其次,直接统计叉积正负的数量,正多负少,是逆时针,反之,顺时针。

一个简单的做法是,计算面积,用面积的正负判断方向。

【面积判断法】

#include<cstdio>
#include<string>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<cctype>
#include<stack>
#include<sstream>
#include<list>
#include<assert.h>
#include<bitset>
#include<numeric>
#define debug() puts("++++")
#define gcd(a,b) __gcd(a,b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define fi first
#define se second
#define pb push_back
#define sqr(x) ((x)*(x))
#define ms(a,b) memset(a,b,sizeof(a))
#define sz size()
#define be begin()
#define pu push_up
#define pd push_down
#define cl clear()
#define lowbit(x) -x&x
#define all 1,n,1
#define mod 2000000000000000003
#define rep(i,n,x) for(int i=(x); i<(n); i++)
#define in freopen("in.in","r",stdin)
#define out freopen("out.out","w",stdout)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e18;
const int MAXN =  1e3 + 5;
const int maxm = 1e6 + 10;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int dx[] = {-1,1,0,0,1,1,-1,-1};
const int dy[] = {0,0,1,-1,1,-1,1,-1};
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int maxn = 200050;

struct Point{
    double x, y;
};
double cross(Point a,Point b,Point c) {
    return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
}
//计算多边形面积
double PolygonArea(Point p[], int n)
{
    if(n < 3) return 0.0;
    double s = p[0].y * (p[n - 1].x - p[1].x);
    p[n] = p[0];
    for(int i = 1; i < n; ++ i)
        s += p[i].y * (p[i - 1].x - p[i + 1].x);
    return s * 0.5;
}
Point p1[maxn];
int n1;
int main()
{
    while(scanf("%d",&n1) != EOF ){
        for(int i = 0; i < n1; i++)
            scanf("%lf%lf", &p1[i].x, &p1[i].y);
        if ( PolygonArea(p1,n1) > 0 )
            puts("counterclockwise");
        else
            puts("clockwise");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Roni-i/p/9058424.html

时间: 2024-11-01 16:35:55

判断一个多边形是顺时针还是逆时针的方法的相关文章

简单多边形~判断此多边形是顺时针还是逆时针。

链接:https://www.nowcoder.com/acm/contest/110/B来源:牛客网 题目描述 为了让所有选手都感到开心,Nowcoder练习赛总会包含一些非常基本的问题. 比如说: 按顺时针或逆时针方向给你一个简单的多边形的顶点坐标,请回答此多边形是顺时针还是逆时针. 输入描述: 输入包含N + 1行.第一行包含一个整数N,表示简单多边形的顶点数.在下面的N行中,第i行包含两个整数x i ,y i ,表示简单多边形中的第i个顶点的坐标. 输出描述: 如果简单多边形按顺时针顺序

如何判断封闭多边形是顺时针还是逆时针?

方法一:Green公式 Green公式揭示了平面区域的二重积分和封闭曲线上的线积分的关系. 其中L+表示沿着封闭区域的边界曲线正向. 并且由Green公式的推导过程我们知道: 这里若L=-y,可以保证(1)式子在区域中恒正,且等于封闭区域面积. 同理,M=x,也可以保证(2)式子在区域中恒正,且等于封闭区域面积. 所以我们只需沿着多边形的边求曲线积分,若积分为正,则是沿着边界曲线正方向(逆时针),反之为顺时针,且所得绝对值为多边形面积. NOTE:边界曲线的正向即沿着边界曲线,单连通区域总在边界

(hdu 7.1.1)Shape of HDU(判断一个多边形是否是凸多边形)

题目: Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 159 Accepted Submission(s): 97   Problem Description 话说上回讲到海东集团推选老总的事情,最终的结果是XHD以微弱优势当选,从此以后,"徐队"的称呼逐渐被"徐总"所取代,海东集团(

判断一个指定的Service是否存在的方法

这是一个判断一个指定的Service是否存在的方法.它被用于监视一个Service是否由于已经运转,如果由于各种原因Service已经被停止了.这是在重新启动指定Service.它被用于一个Application中有多个Service.    public static boolean isServiceExisted(Context context, String className) {        ActivityManager activityManager = (ActivityMa

C#判断一个类中有无&quot;指定名称&quot;的方法

C#中可以通过反射分析元数据来解决这个问题,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 using System; using System.Reflection; namespace Hello {     class Program     {  

如何判断一个文件是否存在的几种方法

1, int _access( const char *path, int mode ); 要判断的模式 在头文件unistd.h中的预定义如下: #define R_OK 4 /* Test for read permission. */ #define W_OK 2 /* Test for write permission. */ #define X_OK 1 /* Test for execute permission. */ #define F_OK 0 /* Test for exis

js判断一个值是空的最快方法是不是if(!value){alert(&quot;这个变量的值是null&quot;);}

!逻辑非 操作符(js)-操作于任何值,(!undefined)(!Null)(!任何对象)(!"")(!"lihuan")(!任何非零数字值) (!0)(!NaN)(!true)(!false):逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反:undefined- false/Null-false/任何对象-true/""-false/"lihuan"-true/任何非零数字-true/0-false /Na

Delphi判断一个字符是否为汉字的最佳方法

//判断字符是否是汉字 function IsHZ(ch: WideChar): boolean; var i:integer; begin i:=ord(ch); if( i<19968) or (i>40869) then result:=false else result:=true; end; //判断字符是否是汉字 function IsHZ(ch: WideChar): boolean; var i:integer; begin i:=ord(ch); if( i<19968

js里面判断一个字符串是否包含某个子串的方法

1. ES6的includes, 返回 Boolean var string = "foo", substring = "oo"; string.includes(substring); // true string.includes(substring,2); // false , 第二个参数表示开始查找的位置 2. ES5 indexOf,返回子串起始位置,不包含则返回-1 var string = "foo", substring = &q