zoukankan      html  css  js  c++  java
  • hrbustoj 1142:围困(计算几何基础题,判断点是否在三角形内)

    围困

    Time Limit: 1000 MS     Memory Limit: 65536 K

    Total Submit: 360(138 users) Total Accepted: 157(129 users)   Rating:  Special Judge: No

    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

    Author

    齐达拉图


      计算几何,基础题,判断点是否在三角形内

      这道题可以用来练习叉积的应用,思路是如果Leyni位置的点与三个顶点构成的向量与三个边代表的向量(必须是一个顺序,都是逆时针,或都是顺时针)的叉积都大于0或者都小于0,则Leyni在三角形内。需要注意的是不能只考虑一种情况,例如只考虑>0的情况,而不考虑<0的情况,这样会WA。

      复杂代码

     1 #include <stdio.h>
     2 #define eps 1e-10
     3 typedef struct{    //定义点
     4     double x,y;
     5 }Point;
     6 typedef Point Vector;    //定义向量
     7 double Cross(Vector a,Vector b)    //叉积
     8 {
     9     return a.x*b.y - a.y*b.x;
    10 }
    11 bool isn(Point a,Point b,Point c,Point p)    //判断点p是否在三角形abc内
    12 {
    13     Vector ab,bc,ca;    //创建向量
    14     Vector ap,bp,cp;
    15     ab.x = b.x - a.x;ab.y = b.y - a.y;    //向量赋值
    16     bc.x = c.x - b.x;bc.y = c.y - b.y;
    17     ca.x = a.x - c.x;ca.y = a.y - c.y;
    18     ap.x = p.x - a.x;ap.y = p.y - a.y;
    19     bp.x = p.x - b.x;bp.y = p.y - b.y;
    20     cp.x = p.x - c.x;cp.y = p.y - c.y;
    21 
    22     if( Cross(ab,ap)>eps && Cross(bc,bp)>eps && Cross(ca,cp)>eps || 
    23         Cross(ab,ap)<eps && Cross(bc,bp)<eps && Cross(ca,cp)<eps)    //核心代码。注意不能单考虑一种情况(>0 或 <0)
    24         return true;
    25     else 
    26         return false;
    27 }
    28 int main()
    29 {
    30     int x1,y1,x2,y2,x3,y3,xLeyni,yLeyni;
    31     while(scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&xLeyni,&yLeyni)!=EOF){    //输入四对坐标
    32         if( (xLeyni==x1 && yLeyni==y1) ||
    33             (xLeyni==x2 && yLeyni==y2) ||
    34             (xLeyni==x3 && yLeyni==y3) ){
    35             printf("Die
    ");    //如果Leyni正好在三角形顶点上,则直接死掉
    36             continue;
    37         }
    38         Point a,b,c,p;    //将输入的坐标赋给点
    39         a.x = double(x1),a.y = double(y1);
    40         b.x = double(x2),b.y = double(y2);
    41         c.x = double(x3),c.y = double(y3);
    42         p.x = double(xLeyni),p.y = double(yLeyni);
    43 
    44         if(isn(a,b,c,p))    //判断是否在三角形内
    45             printf("Die
    ");
    46         else
    47             printf("Live
    ");
    48     }
    49     return 0;
    50 }

      优化代码

     1 #include <stdio.h>
     2 typedef struct {    //定义点
     3     double x,y;
     4 }Point;
     5 double Cross(Point a,Point b,Point c)    //三点求叉积
     6 {
     7     return (b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x);
     8 }
     9 int main()
    10 {
    11     Point a,b,c,p;    //定义四点
    12     while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&p.x,&p.y)!=EOF){    //输入四对坐标
    13         if( (Cross(a,b,p)>0 && Cross(b,c,p)>0 && Cross(c,a,p)>0) || 
    14             (Cross(a,b,p)<0 && Cross(b,c,p)<0 && Cross(c,a,p)<0) )    //判断点p是否在三角形abc内。注意不能只考虑一种情况(<0 或 >0)
    15             printf("Die
    ");
    16         else 
    17             printf("Live
    ");
    18     }
    19     return 0;
    20 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    JPA或Hibernate中的
    mysql如何在一个字段后面加个字符?
    mysql 怎么通过sql语句批量去掉某一个表中某一个字段的多余字符
    MySql怎样去掉某个字段最后的逗号或最后的字
    condition_variable_any
    Python获取本机外网IP
    Ftp download
    5. Abstract Factory
    0. Design Principle
    4. Factory Method
  • 原文地址:https://www.cnblogs.com/yym2013/p/3646417.html
Copyright © 2011-2022 走看看