HDU-4793 几何

原创 2017年10月04日 16:11:28

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793

题目大意 :有一个圆硬币半径为r,初始位置为x,y,速度矢量为vx,vy,有一个圆形区域(圆心在原点)半径为R,还有一个圆盘(圆心在原点)半径为Rm (Rm < R),圆盘固定不动,硬币撞到圆盘上会被反弹,不考虑能量损失,求硬币在圆形区域内运动的时间。

运动方程:

x’=x+t*vx;
y’=y+t*vy;
r’=r1+r2;
x’^2+y’^2=r’^2;

解法: 解方程,求 (x+vx*t,y+vy*t) 代入圆形区域方程是否有解,如果没解,说明硬币运动轨迹与圆形区域都不相交,答案为0

如果有解,再看代入圆盘有没有解,如果有解,即为两个解的差值*2, 如果没解,那么就是与圆形区域相交的两个点的t的差值。

难点在于如何构造出两个运动轨迹方程,为什么这么构造。

一共四种情况:

第一种:与外圆相离相切,输出0。

第二种:与外圆相交,与内圆相离相切,输出外圆两个解的差的绝对值。

第三种:与外圆相交,与内圆相交,输出外圆两个解的差的绝对值减去内圆两个解的差的绝对值。

第四种:与外圆相交即有两个解,但是两个解都是负的(要么都是负数要么都是正数),也就是说反向运动才能进入大圆,输出0。

#include<bits/stdc++.h>
#define UP(i,l,h) for(int i=l;i<h;i++)
#define W(t) while(t)
using namespace std;
double eps=1e-10;
int sgn(double x)
{
    if(x > eps) return 1;
    if(x < -eps) return -1;
    return 0;
}
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))
    {
        double A1=vx*vx+vy*vy;
        double B1=2*x*vx+2*y*vy;
        double C1=x*x+y*y-(R+r)*(r+R);
        double A2=A1;
        double B2=B1;
        double C2=x*x+y*y-(RM+r)*(RM+r);
        double detla1=B1*B1-4.0*A1*C1;
        double detla2=B2*B2-4.0*A2*C2;
        double s11=(-B1-sqrt(detla1))/(2.0*A1);
        double s12=(-B1+sqrt(detla1))/(2.0*A1);
        double s21=(-B2-sqrt(detla2))/(2.0*A2);
        double s22=(-B2+sqrt(detla2))/(2.0*A2);
        if(sgn(detla1)<=0) //不与圆相交
        {
            printf("0.000\n");
            continue;
        }
        if(sgn(s12)>=0)
        {
            if(sgn(detla2)<=0) //只与外面的圆相交
                printf("%.3f\n",fabs(s11-s12));
            else  //与内外两个圆相交
                printf("%.3f\n",2*fabs(s21-s11));
        }
        else  //反向
            printf("0.000\n");

    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

射影几何基础(一)

前言这是关于计算机视觉中的多视图几何学的一篇学习记录,在这本书第一次接触到射影几何学,这是和之前所接触的解析几何、古希腊传承的纯粹几何不同,射影几何可以说是链接着各个学科的桥梁,有着惊人的对称性和美一...
  • ArtistA
  • ArtistA
  • 2016年04月10日 15:21
  • 1318

多视图几何——介绍(一)

Introduction – a Tour of Multiple View Geometry        本章是对主要思想的介绍,并对这些话题进行了非正式的处理。精确、明确的定义、缜密的代数以及对...
  • weixin_38074905
  • weixin_38074905
  • 2017年06月26日 14:06
  • 552

最小二乘法的几何解释

用通俗易懂的语言,从列向量的几何角度解释了最小二乘法.
  • Macer3
  • Macer3
  • 2015年09月12日 15:08
  • 1489

(CV,Math)射影几何

本文地址: 计算机视觉中常涉及欧式几何(Euclidean Geometry)、仿射几何(Affine Geometry)、射影几何(Projective Geometry)、微分几何( Diff...
  • mounty_fsc
  • mounty_fsc
  • 2016年05月25日 23:06
  • 1220

Windows 8 Directx 开发学习笔记(十四)使用几何着色器实现三角形细分

几何着色器是从DirectX 10才引入的着色器,是一个可选阶段,位于顶点着色器和像素着色器阶段之间。顶点着色器以顶点作为输入数据,而几何着色器以完整的图元作为输入数据,像点、直线、三角形等。之所以引...
  • RaymondCode
  • RaymondCode
  • 2013年01月15日 08:39
  • 8370

几何着色器

通过顶点着色器和片段着色器,可以将输入的顶点经过着色器的处理显示到屏幕上。OpenGL 3.2及更新的版本支持几何着色器,介于顶点着色器和片段着色器之间,几何着色器接收顶点着色器的输出作为输入,通过高...
  • lizhenneng
  • lizhenneng
  • 2015年09月25日 15:13
  • 1804

什么是椭圆几何与双曲几何?

什么是椭圆几何与双曲几何? 平时我们所研究的几何,称欧几里得几何(欧氏几何),  随着数学的发展,建立了新的几何学,一般称非欧几里得几何,其中有两类,一类称双曲几何,也称罗巴切夫斯基几...
  • zzwu
  • zzwu
  • 2015年06月30日 07:07
  • 2195

OpenGL核心技术之几何着色器

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...
  • jxw167
  • jxw167
  • 2017年02月18日 13:14
  • 1638

DirectX11 几何着色器阶段

几何着色器阶段 1. 几何着色器阶段有什么功能? 几何着色器阶段(geometry shader stage)是可选的,我们在第11章之前不会用到它,所以这里只做一个简短的概述。几何着色器以完整的...
  • sinat_24229853
  • sinat_24229853
  • 2015年09月29日 21:53
  • 930

(CV,Math)仿射几何

本文地址: 1 仿射变换矩阵表示以二维坐标为例讲述仿射变换。变换前坐标为(x,y)(x,y),变换后坐标为(x′,y′)(x',y'),本文均使用齐次坐标系,且此处不介绍其次坐标。二维仿射变换保持了图...
  • mounty_fsc
  • mounty_fsc
  • 2016年05月25日 00:15
  • 1088
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU-4793 几何
举报原因:
原因补充:

(最多只允许输入30个字)