zoj3728_Collision(简单计算几何)



///////////////////////////////////////////////////////////////////////////////////////////////////////

作者:tt2767

声明:本文遵循以下协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0

查看本文更新与讨论请点击:http://blog.csdn.net/tt2767

链接被删请百度: CSDN tt2767

///////////////////////////////////////////////////////////////////////////////////////////////////////



题解:这题看明白之后主要是套模板去算。

1.用点积(dot)去判断是否不经过圆

2.用叉积求出原点到直线的距离

3.两种情况:撞击后反弹 或者 不撞击

4.记得只保留3位小数

#include<sstream>
#include<string>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<math.h>
#include <iterator>
#include<map>
#include <stack>
#include<queue>
#include<set>
#include <list>
#include<functional>
#include<numeric>
using namespace std;
inline int lowbit(int x){ return x&(-x);}

struct Point
{
    double x,y;
    Point(double x,double y):x(x),y(y){}
    Point(){}
};
typedef Point Vector;

double cross(Vector a , Vector b)
{
    return a.x*b.y-a.y*b.x;
}
double dot(Vector a , Vector b)
{
    return a.x*b.x+a.y*b.y;
}
typedef  long long int LL;
const double eps = 1e-9;
const int INF = 0x3f3f3f3f ;
const long double PI = acos(0.0) * 2.0;
const int N = 100009;

int main()
{
    double Rm,R,r,x,y,vx,vy;
    while(scanf("%lf%lf%lf%lf%lf%lf%lf",&Rm,&R,&r,&x,&y,&vx,&vy)==7 )
    {
        Point p(x,y);
        Vector s(0-x,0-y),v(vx,vy);
        Rm+=r;
        R+=r;
        double vel = sqrt(v.x*v.x+v.y*v.y);
        double d = fabs(cross(s,v))/vel;

        if(dot(s,v) < eps || d-R > eps)
            printf("0.000\n");
        else if(d - Rm > eps)
            printf("%.3lf\n",2*sqrt(R*R-d*d)/vel);
        else
            printf("%lf\n",2*( sqrt(R*R-d*d) -  sqrt(Rm*Rm-d*d) )/vel );
    }
    return 0;
}

版权声明:本文为博主原创文章,允许非商业性转载,转载必须注名作者(CSDN tt2767)与本博客链接:http://blog.csdn.net/tt2767。

时间: 2024-10-19 03:42:01

zoj3728_Collision(简单计算几何)的相关文章

[HDU 4082] Hou Yi&#39;s secret (简单计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4082 题目大意: 给你n个点,问能最多构成多少个相似三角形. 用余弦定理,计算三个角度,然后暴力数有多少个,更新答案. 代码: 1 #include <cstdio> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstring> 5 #include <vector> 6 #includ

POJ 1556 The Doors(简单计算几何+最短路)

●赘述题目 10*10的房间内,有竖着的一些墙(不超过18个).问从点(0,5)到(10,5)的最短路. 按照输入样例,输入的连续5个数,x,y1,y2,y3,y4,表示(x,0--y1),(x,y2--y3),(x,y4--10)是墙壁. ●题解 方法:建图(用到简单计算几何)+最短路 ○记录下每个端点. ○包含起点,终点,以及每个墙的可以走的端点,如下图: ○然后枚举点,尝试两两组合连(线段)边,若该线不会撞在墙上,即不会与墙壁线段相交,就add_adge(). 效果图如下: 如何判断呢?

HDU2948Geometry Darts(简单计算几何)

题目大意就是说两个人掷飞镖,飞镖在所给定的图形内就记一分,现在给定N个图形(圆.三角形和矩形),问每一次比赛(没人分别掷三次)谁赢. 1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <vector> 8 #include <c

cf13B Letter A(分类+简单计算几何,,)

题意: 给三个线段(每个线段的两个端点的坐标),问这三个线段能否组成字母A. 组成字母A的条件: 1.两个线段有公共端点. 2.这两个线段夹角小于等于90度. 3.第三个线段的两个端点分别在这两个线段上,且各自分割的大小比率不超过4:1 思路: 直接..... 应该开始积累计算几何的代码了,,,, 代码: struct Point{ double x,y; }; struct segment{ Point a,b; } S[5]; bool samePoint(Point a,Point b){

Gym 101917 E 简单计算几何,I 最大流

题目链接 https://codeforces.com/gym/101917 E 题意:给定一个多边形(n个点),然后逆时针旋转A度,然后对多边形进行规约,每个点的x规约到[0,w]范围内,y规约到[0,h]范围内,输出规约后的结果. 解析:求出来 多边形的长和宽,再和w,h比较,对点按比例进行缩放就好了. (多边形旋转其实是绕给出的第一个点旋转,以为是绕原点wa了1发). AC代码 1 #include <bits/stdc++.h> 2 #define Vector Point 3 usi

UVA - 10250 - The Other Two Trees (简单计算几何)

UVA - 10250 The Other Two Trees Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem E The Other Two Trees Input: standard input Output: standard output Time Limit: 2 seconds You have a quadrilateral

HDU 4793 Collision (2013长沙现场赛,简单计算几何)

Collision Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 685    Accepted Submission(s): 248Special Judge Problem Description There's a round medal fixed on an ideal smooth table, Fancy is tryin

poj 1687 Buggy Sat 简单计算几何

暑期集训出的第一道一血 感觉自己萌萌哒…… 这道题本身并没有坑点 仅仅是翻译巨坑…… 解大腿在做B 安学长在做E 我闲着也没事 就一个词一个词翻译F…… 最后感觉…… 题干大多数都看不懂…… 也都没啥用…… 大概呢…… 就是给你n个点…… m条回路…… 问你哪条回路是最外面的…… 总之最后就是让你求哪个回路组成的图形面积最大…… 考点就是多边形面积公式…… 怕有误差就没加/2…… 好像加了也能过吧…… WA了两次 一次是选错点了 一次是第一个点和最后一个点顺序反了…… 1 #include<st

hihoCoder - 1040 - 矩形判断 (简单计算几何~)

#1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T(1<=T<=100),代表测试数据的数量. 每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000):其中(x1, y1), (x2,y2)代表一条线段的两个端点. 输出 每组数据输出一行YES或者NO,表示输入的