zoukankan      html  css  js  c++  java
  • bnu 10783 格斗游戏 线段与圆的关系

    格斗游戏

    1000ms
    65536KB
     
    64-bit integer IO format: %lld      Java class name: Main
    Font Size:  
    Type:  
    大家知道,在格斗游戏中有各式各样的大招,因此大招的形状也是层出不穷。而在这些形状中,当然少不了圆这个完美的图形。
    作为编写游戏的程序员,你需要判断玩家A放出的圆形大绝招与玩家B在同一个平面上时,是否能击中玩家B。
    问题来了,如果给定玩家B和圆的位置,你能否知道玩家B是否被圆击中?当然,玩家B可能被完全击中,也可能只被击中身体的部分位置,也可能没有被击中。对于不同的击中程度,玩家B所损失的体力也不一样,因此你还要判断玩家B被击中的程度。为了简化问题,我们将玩家B的角色看作一条线段。
     

    Input

    第一行为N(N<=30),表示数据组数。
    每一组数据有两行,格式如下:
    cx cy r
    x1 y1 x2 y2
    第一行为圆心的XY坐标和半径,第二行分别为线段两端点的XY坐标。
    输入数据保证线段两端点不同,输入均为绝对值在100以内整数。 
     

    Output

    对于每组数据,输出一行,表示如下关系的一种:
    ALL IN  :线段完全在圆的内部或圆上,即没有严格在圆外的部分
    PART IN :线段有一些部分严格在圆内,也有一些部分严格在圆外
    ALL OUT :线段完全在圆的外部或圆上,即没有严格在圆内的部分
     

    Sample Input

    3
    0 0 1
    0 0 0 1
    0 0 1
    0 0 1 1
    0 0 1
    1 0 1 1
    
     

    Sample Output

    ALL IN
    PART IN
    ALL OUT
    
     

    Source

    Author

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 using namespace std;
     5 
     6 int dist2 (int x1, int y1, int x2, int y2)
     7 {
     8     return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
     9 }
    10 
    11 int pointPro (int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    12 {
    13     return (x2 - x1) * (x4 - x3) + (y2 - y1) * (y4 - y3);
    14 }
    15 
    16 int work (int x0, int y0, int r, int x1, int y1, int x2, int y2)//圆坐标和半径,线段的两个端点
    17 {
    18     int A, B, C, OA2, OB2, R2;
    19     A = y2 - y1;
    20     B = x1 - x2;
    21     C = x2 * y1 - x1 * y2;
    22     R2 = r * r;
    23     if ((A * x0 + B * y0 + C) * (A * x0 + B * y0 + C) >= R2 * (A * A + B * B))
    24         return 1;//没有严格在里面 (圆外)
    25     OA2 = dist2 (x0, y0, x1, y1);
    26     OB2 = dist2 (x0, y0, x2, y2);
    27     if (OA2 <= R2 && OB2 <= R2)
    28         return -1;//没有严格在外面 (圆内)
    29     if (OA2 > R2 && OB2 < R2 || OA2 < R2 && OB2 > R2)
    30         return 0;
    31     if (pointPro (x0, y0, x1, y1, x1, y1, x2, y2) * pointPro (x0, y0, x2, y2, x2, y2, x1, y1) < 0)
    32         return 1;
    33     else
    34         return 0;
    35 }
    36 
    37 
    38 int main()
    39 {
    40     int t;
    41     int cx,cy,r,x1,x2,y1,y2;
    42     while(scanf("%d",&t)>0)
    43     {
    44         while(t--)
    45         {
    46             scanf("%d%d%d",&cx,&cy,&r);
    47             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    48             int hxl=work(cx,cy,r,x1,y1,x2,y2);
    49             if(hxl==1) printf("ALL OUT
    ");
    50             else if(hxl==-1) printf ("ALL IN
    ");
    51             else printf ("PART IN
    ");
    52         }
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    Curl Get请求&漏参数
    【Java基础】日期操作(返回当前日期&日期比较)
    【Java基础】生产者消费者模式
    [Groovy] 在Groovy中优雅的实现do while
    【转载】时间复杂度的度量
    [转载]Spring Cloud初探
    [Maven] 使用Maven管理多模块项目
    JS基础三
    JS基础部分(二)
    笔记不详细记录了,学完css之后做出下面分布的导航页
  • 原文地址:https://www.cnblogs.com/tom987690183/p/3349129.html
Copyright © 2011-2022 走看看