欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算几何(判断顺时针/逆时针) - Clockwise or Counterclockwise - HDU 6857

程序员文章站 2022-04-02 19:02:03
...

计算几何(判断顺时针/逆时针) - Clockwise or Counterclockwise - HDU 6857

2020 Multi-University Training Contest 8

题意:

A,B,CABC给定三个点的坐标,A,B,C,判断从A到B到C是顺时针还是逆时针。

输入:

T(1T1000)T(1≤T≤1 000)组测试数据,

(xi,yi)109xi,yi109.每组包括三个点的坐标(x_i,y_i)。−10^9≤x_i,y_i≤10^9.

输出:

Clockwise若是顺时针,输出:Clockwise

Counterclockwise若是逆时针,输出:Counterclockwise

Sample Input

3
1 2 2 1 -1 -2
4 3 -4 3 3 4
4 -3 4 3 3 4

Sample Output

Clockwise
Clockwise
Counterclockwise

分析:

右手定则

α×β βα\overrightarrow{α}×\overrightarrow{β} \\ \ \\若β在α的逆时针方向,则为正值

顺时针则为负值

线0两向量共线则为0

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

#define P pair<double,double>
#define x first
#define y second

using namespace std;

int T;
P V[5];
P s[5];

double Cross(P a,P b)
{
    return a.x*b.y-a.y*b.x;
}

int main()
{
    cin>>T;
    while(T--)
    {
        for(int i=0;i<3;i++) scanf("%lf%lf",&V[i].x,&V[i].y);
        for(int i=0;i<2;i++) s[i]={V[i+1].x-V[i].x,V[i+1].y-V[i].y};
        
        bool z=true;
        if(Cross(s[0],s[1])>0) z=false; 
            
        if(z) puts("Clockwise");
        else puts("Counterclockwise");
    }
    return 0;
}