题目链接: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 所走的方向不变,亦即三点在一直线上。