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

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

2020 Multi-University Training Contest 8

题意:

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

输入:

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

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

输出:

若 是 顺 时 针 , 输 出 : C l o c k w i s e 若是顺时针,输出:Clockwise Clockwise

若 是 逆 时 针 , 输 出 : C o u n t e r c l o c k w i s e 若是逆时针,输出: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 线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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过鼠标移动的方向来判断顺时针还是逆时针。 首先,在mousedown事件中记录下鼠标点击时的坐标(x1, y1)。然后,在mousemove事件中计算当前鼠标位置与鼠标点击时的位置之间的向量(vx, vy)。最后,通过计算向量(vx, vy)与上一次鼠标移动时的向量(uvx, uvy)的旋转方向来判断顺时针还是逆时针。 具体做法如下: 1. 在mousedown事件中记录下鼠标点击时的坐标(x1, y1)。 ``` let x1, y1; element.addEventListener('mousedown', (event) => { x1 = event.clientX; y1 = event.clientY; }); ``` 2. 在mousemove事件中计算当前鼠标位置与鼠标点击时的位置之间的向量(vx, vy)。 ``` let vx, vy; element.addEventListener('mousemove', (event) => { const x2 = event.clientX; const y2 = event.clientY; vx = x2 - x1; vy = y2 - y1; }); ``` 3. 在mousemove事件中计算向量(vx, vy)与上一次鼠标移动时的向量(uvx, uvy)的旋转方向。 ``` let uvx, uvy; let rotationDirection = null; element.addEventListener('mousemove', (event) => { const x2 = event.clientX; const y2 = event.clientY; if (vx !== undefined && vy !== undefined) { uvx = vx; uvy = vy; vx = x2 - x1; vy = y2 - y1; const crossProduct = uvx * vy - uvy * vx; if (crossProduct > 0) { rotationDirection = 'clockwise'; } else if (crossProduct < 0) { rotationDirection = 'counterclockwise'; } else { rotationDirection = null; } } }); ``` 这样,在mousemove事件中就可以通过计算向量旋转方向来判断顺时针还是逆时针。需要注意的是,为了避免误判,可以在mousemove事件中增加一些条件判断,例如鼠标是否已经按下等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值