ACM-计算几何之围困——hrbustoj1142

围困

题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1142

Description

Leyni是一名猎人,一天他在草原中散步,遇到了三只老狼,三只老狼围成了一个三角形,如果Leyni在这个三角形中,那么他必死无疑,否则他还有一线生机。
现在已知三只老狼的坐标和Leyni的坐标,请问,Leyni还有活下去的机会吗?

Input
本题有多组测试数据,对于每组测试数据:
第一行,含有4对坐标,x1, y1, x2, y2, x3, y3, xLeyni, yLeyni。前3对坐标表示三只老狼的位置,最后一对表示Leyni的坐标。坐标的范围在[-10000, 10000],且都是整数。
注:输入数据保证Leyni不会在三角形的边上。

Output
对于每组测试数据:
第一行,如果Leyni还有一线生机,那么请输出Live,否则请输出Die

Sample Input
-1 -1 1 -1 0 1 0 0
-1 -1 1 -1 0 1 10 10
Sample Output
Die

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;
}


你可能感兴趣的:(ACM,计算几何,点在三角形内,围困,hrbustoj1142)