先介绍一下叉积,定义三个向量A,B,C;
cross=(C-A)x(B-A);
if(cross>0)
则AB向右拐得到BC;
if(cross==0)
ABC共线
if(cross<0)
则AB向左拐得到BC;
叉积与面积的关系,s=abs(cross)/2;
因此我们可以判断一个点在不在一个几何图形的内部,如果各任意三边叉积绝对值之和=该店与任意两边叉积绝对值之和 则在内部或者边上;
NEFU652题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=652
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
struct point
{
int x,y;
}p[3];
int cross( point A,point B,point C)
{
return (C.x-A.x)*(B.y-A.y)-(C.y-A.y)*(B.x-A.x);
}
int main()
{
point t;
while(~scanf("%d%d",&p[0].x,&p[0].y))
{
scanf("%d%d%d%d",&p[1].x,&p[1].y,&p[2].x,&p[2].y);
scanf("%d%d",&t.x,&t.y);
if(!p[0].x&&!p[0].y&&!p[1].x&&!p[1].y&&!p[2].y&&!p[2].x&&!t.x&&!t.y)
break;
int m,m1,m2,m3;
m=abs(cross(p[0],p[1],p[2]));
m1=abs(cross(t,p[0],p[1]));
m2=abs(cross(t,p[0],p[2]));
m3=abs(cross(t,p[1],p[2]));
if(m==0&&m1==0&&m2==0&&m3==0)
puts("YES");
else if(m==0||m1==0||m2==0||m3==0)
puts("NO");
else
{
if(m==m1+m2+m3)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}