Counter-Clockwise
Time limit1000 ms | Memory 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;
}