Counter-Clockwise 三点位置关系 计算几何学

题目链接:https://vjudge.net/problem/Aizu-CGL_1_C

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    double x0,y0,x1,y1;
    scanf("%lf%lf%lf%lf",&x0,&y0,&x1,&y1);
    int q;
    scanf("%d",&q);
    double x2,y2;
    while(q--)
    {
        scanf("%lf%lf",&x2,&y2);
        double  ans=(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);
        if(ans>0)
        {
            printf("COUNTER_CLOCKWISE\n");  ///1
        }
        else if(ans<0)
        {
            printf("CLOCKWISE\n");///2
        }
        else
        {
            double ans1=(x1-x0)*(x2-x0)+(y1-y0)*(y2-y0);
            if(ans1<0)
            {
                printf("ONLINE_BACK\n");///3
            }
            else
            {
                double l1=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
                double l2=sqrt((x2-x0)*(x2-x0)+(y2-y0)*(y2-y0));
                if(l1<l2)
                {
                    printf("ONLINE_FRONT\n");///4
                }
                else printf("ON_SEGMENT\n");///5
            }
        }
    }
}

向量积可以被定义为:
模长:(在这里θ表示两向量之间的夹角(共起点的前提下)(0°≤θ≤180°),它位于这两个矢量所定义的平面上。)
在这里插入图片描述
方向:a向量与b向量的向量积的方向与这两个向量所在平面垂直,且遵守右手定则。(一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系是满足右手定则的,当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向是c的方向。)
也可以这样定义(等效):
向量积|c|=|a×b|=|a||b|sin<a,b>
即c的长度在数值上等于以a,b,夹角为θ组成的平行四边形的面积。
而c的方向垂直于a与b所决定的平面,c的指向按右手定则从a转向b来确定。
*运算结果c是一个伪向量。这是因为在不同的坐标系中c可能不同。 [1]

在这里插入图片描述

设 p1=(x1,y1),p2=(x2,y2),p3=(x3,y3)
p12=(x2-x1, y2-y1) p23=(x3-x2, y3-y2)
则当 p12 与 p23 的叉乘(向量积)p12 x p23 = (x2-x1)(y3-y2)-(y2-y1)(x3-x2)
为正时,p1-p2-p3路径的走向为逆时针,
为负时,p1-p2-p3 走向为顺时针,
为零时,p1-p2-p3 所走的方向不变,亦即三点在一直线上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值