Aizu -CGL_1_C Counter-Clockwise(差积判断共点射线位置关系)

Counter-Clockwise

Time limit1000 msMemory limit131072 kB

在这里插入图片描述
For given three points p0,p1,p2, print

COUNTER_CLOCKWISE
if p0,p1,p2 make a counterclockwise turn (1),

CLOCKWISE
if p0,p1,p2 make a clockwise turn (2),

ONLINE_BACK
if p2 is on a line p2,p0,p1 in this order (3),

ONLINE_FRONT
if p2 is on a line p0,p1,p2 in this order (4),

ON_SEGMENT
if p2 is on a segment p0p1 (5).

Input
xp0 yp0 xp1 yp1
q
xp20 yp20
xp21 yp21

xp2q−1 yp2q−1
In the first line, integer coordinates of p0 and p1 are given. Then, q queries are given for integer coordinates of p2.

Output
For each query, print the above mentioned status.

Constraints
1≤q≤1000
−10000≤xi,yi≤10000
p0 and p1 are not identical.

Sample Input 1
0 0 2 0
2
-1 1
-1 -1
Sample Output 1
COUNTER_CLOCKWISE
CLOCKWISE

Sample Input 2
0 0 2 0
3
-1 0
0 0
3 0
Sample Output 2
ONLINE_BACK
ON_SEGMENT
ONLINE_FRONT

分别求出p0与p1和p0与p2的向量,用差积判断位置关系。
这里变量Y0不要用y0,否则编译错误,说什么指针不能参与加法运算,搞不懂。

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<math.h>
using namespace std;

int X0, Y0, X1, Y1, X2, Y2;
int m;

int main()
{
    while(scanf("%d%d%d%d", &X0, &Y0, &X1, &Y1)!=EOF)
    {
        int X01=X1-X0, Y01=Y1-Y0;
        scanf("%d", &m);
        while(m--)
        {
            scanf("%d%d", &X2, &Y2);
            int X02=X2-X0, Y02=Y2-Y0;
            int cha=X01*Y02-Y01*X02;//差积
            if(cha>0)//大于0说明02在01右边
                printf("COUNTER_CLOCKWISE\n");
            else if(cha<0)//在左边
                printf("CLOCKWISE\n");
            else//重合
            {
                if(X1==X0&&X2==X0)//平行y轴
                {
                    if(1.0*Y02/Y01<0)//判断方向
                        printf("ONLINE_BACK\n");
                    else
                    {
                        if(fabs(Y02)>fabs(Y01))
                            printf("ONLINE_FRONT\n");
                        else
                            printf("ON_SEGMENT\n");
                    }
                }
                else if(Y1==Y0&&Y2==Y0)//平行x轴
                {
                    if(1.0*X02/X01<0)//判断方向
                        printf("ONLINE_BACK\n");
                    else
                    {
                        if(fabs(X02)>fabs(X01))
                            printf("ONLINE_FRONT\n");
                        else
                            printf("ON_SEGMENT\n");
                    }
                }
                else
                {
                    if(1.0*X02/X01<0)
                        printf("ONLINE_BACK\n");
                    else
                    {
                        if(fabs(X02)>fabs(X01))
                            printf("ONLINE_FRONT\n");
                        else
                            printf("ON_SEGMENT\n");
                    }
                }
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值