题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1142
Description
Leyni是一名猎人,一天他在草原中散步,遇到了三只老狼,三只老狼围成了一个三角形,如果Leyni在这个三角形中,那么他必死无疑,否则他还有一线生机。Live
求点是否在三角形内,我是以这一道题为跳板,准备做点是否在凸多边形内的模板。
做法就是叉积法,判断点对于相应边的位置是否都是同一方向(都顺时针 或 都逆时针)
#include <iostream>
using namespace std;
struct point
{
double x,y;
};
// p0为起始点,求p1点在p0,p2所在直线的哪一侧
// 也可以说,p0p1构成的向量v在p0p2构成的向量w的哪一边
double cross(point p0,point p1,point p2)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int main()
{
point a,b,c,p;
while(cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>p.x>>p.y)
{
// 顺时针和逆时针都行
if( (cross(a,p,b)>0 && cross(c,p,a)>0 && cross(b,p,c)>0) || (cross(a,p,b)<0 && cross(c,p,a)<0 && cross(b,p,c)<0) )
cout<<"Die"<<endl;
else cout<<"Live"<<endl;
}
return 0;
}