HDU5572平面几何问题

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

HDU 5572An Easy Physics Problem

题意:
光滑平面,一个刚性小球,一个固定的刚性圆柱体
给定圆柱体圆心坐标,半径
小球起点坐标,起始运动方向(向量)
终点坐标
问能否到达终点,小球运动中如果碰到圆柱体会反射(基本物理知识)

思路:
根据高中平面几何知识很快找到判断方法,但是向量的代码实现有一些麻烦,浪费时间,使用向量模板会方便许多

#include<cstdio>
#include<cmath>
struct node{
    double dis(node);//两点距离

    //向量操作
    node add(node);//加
    double mul(node);//乘
    node mul(double);//倍
    double abs();//模长
    node unt();//单位化
    node neg();//取反
    double agl(node);//夹角,度数
    bool eql(node);//向量相等
    int pal(node);//向量平行

    double x,y;
};
double node::dis(node a){
    return sqrt(pow(x-a.x,2)+pow(y-a.y,2));
}

node node::add(node a){
    return {x+a.x,y+a.y};
}
double node::mul(node a){
    return x*a.x+y*a.y;
}
node node::mul(double a){
    return {x*a,y*a};
}
node node::neg(){
    return {-x,-y};
}

double node::abs(){
    return sqrt(x*x+y*y);
}
node node::unt(){
    double d=this->abs();
    return {x/d,y/d};
}
double node::agl(node a){
    return acos((x*a.x+y*a.y)/(this->abs()*a.abs()));
}

bool node::eql(node a){
    if(fabs(x-a.x)<1e-6&&fabs(y-a.y)<1e-6)return 1;
    return 0;
}
int node::pal(node a){
    node u1=this->unt();//判断单位向量
    node u2=a.unt();
    if(u1.eql(u2))return 1;//方向相同
    if(u1.eql(u2.neg()))return -1;//方向相反
    return 0;
}


double r;
node A,B,C,O;
node AB,AC,AO;
double root(double a,double b,double c){//一元二次方程求根
    return (-b-sqrt(b*b-4*a*c))/(2*a);
}
void getC(){//由起点,向量,得到C点坐标
    double ao=A.dis(O);
    double ac=root(1,-2*ao*cos(AC.agl(AO)),ao*ao-r*r);
    C=A.add(AC.unt().mul(ac));
}
int judge(node a,node b,node c){//两个向量和平行于另一个向量
    if(a.add(b).pal(c)==1)return 1;//向量同向
    return 0;
}
int stop(){//线段在圆外
    double a=B.dis(O);
    double b=A.dis(O);
    if(a<r||b<r)return 1;
    double c=A.dis(B);
    double p=(a+b+c)/2;
    double s=sqrt(p*(p-a)*(p-b)*(p-c));//海伦公式
    if(c>a&&c>b){//关键点
        if(2*s/c<r)return 1;
        return 0;
    }
    return 0;
}
int conet(){//如果从A直接到B
    if(AC.pal(AB)==1)return 1;//两向量同向
    return 0;
}
int work(){
    AB={B.x-A.x,B.y-A.y};
    AO={O.x-A.x,O.y-A.y};
    if(stop())return 0;
    if(conet())return 1;

    getC();//得到C的坐标
    node CB={B.x-C.x,B.y-C.y};
    node OC={C.x-O.x,C.y-O.y};
    if(judge(AC.neg().unt(),CB.unt(),OC.unt()))return 1;
    return 0;
}
int main(){
    int T;
    scanf("%d",&T);
    for(int kase=1;kase<=T;kase++){//反射点C的坐标未知
        scanf("%lf%lf%lf",&O.x,&O.y,&r);
        scanf("%lf%lf%lf%lf",&A.x,&A.y,&AC.x,&AC.y);
        scanf("%lf%lf",&B.x,&B.y);

        printf("Case #%d: ",kase);
        if(work())printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}



hdu 5572 An Easy Physics Problem(几何) 题目链接:hdu 5572 An Easy Physics Problem解题思路注意精度误差,发射的情况可以对应求出B点的对称点再判断代码#include <cstdio> #include <cstring> #include <cmath> #include <algorithm>using namespace std; const double eps = 1e-8; const doubl 阅读详情

相关推荐

初等数学复习及研究 平面几何 梁绍鸿 清晰版

找了很久,感谢梁绍鸿老师 找了很久,感谢梁绍鸿老师 找了很久,感谢梁绍鸿老师,感谢90xz.com

An Easy Physics Problem HDU - 5572(直线与圆的关系)

这个题直接自闭到结尾 定义p1_1(为p1的方向点)首先判断p1_1与p1的直线与圆的交点如果交点个数小于等于2个只要判断p2点与p1到p1_1的方向向量同向(判断方法为叉积为0说明平行点积大于0说明同向) 当直线与圆交点的个数为2时,这时候情况比较特殊,p3_1为与圆的交点离p1最近的点,情况1:p1的方向刚好是往圆那个方向上走去,并且p2点刚好在p1与p3_1这条线段上这时候肯定能碰到!!...

leekerian的博客 224

HDU 5572-An Easy Physics Problem (计算几何)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5572题目大意: 有一个无体积的球,近似为质点,一开始给出球的初始位置和运动方向(为从原点到给出点的向量方向),同时平面中有一个圆柱体,给出圆心位置和半径,若球撞击圆柱体,则产生以撞击点切线为反射面的无损反弹,求问球是否会经过给定的P点分析: 大体上可以分成两类情况,球会撞击圆柱或者不会撞击圆柱

SD_Stjean的博客 420

HDU 5572 2015 上海区域赛 A题 计算几何(碰撞反弹、注意精度)

题意:给一个圆和圆外两点A、B,在A以给定的速度(方向)出发,若碰到圆则发生完全弹性碰撞,问能否经过B。 这题现场赛时卡出了xiang了~,并最终导致打铁。 解法: 圆心O(x0,y0) , A(x1,y1) , B(x2,y2) , Vec(v1,v2) A点在碰撞到圆之前的运动参数方程可以确定 x=x1+t*v1 y=y1+t*v2   (t>0) 将其带入圆的方程  (x-x0

makewei13的博客 2345

HDU - 5572 An Easy Physics Problem(几何-碰撞问题)

题目链接:点击查看 题目大意:在一个二维平面上,给出一个实心圆柱体,再给出一个可以视为质点的小球,小球初始时位于点 A ,会给出一个速度向量 VA,当小球碰到圆柱体时,会因碰撞弹开,规定碰撞不会丢失动能,问在小球在运动的过程中能不能到达点 B 题目分析:稍微画一下图: 为了方便表示射线,我在无穷远处计算出了一个点 inf,这样射线 A就转换为了线段 ( A , inf ),同理图中的 l1 和 l3 都是以线段表示的射线,图中点 P 表示为圆心,G1 和 G2 表示 l1 与圆的两个交点,规定 .

Falcon的博客 564

HDU5572(计算几何+精度)

原题:HDU5572 关于精度:关于精度 点关于直线对称公式: 点( x , y )关于直线Ax + by + C = 0 的对称点( X , Y ): 设参数方程 联立圆方程得到关于t的一元二次方程 可见c>0恒成立 分两种情况讨论: 1.小球不反弹 2(1).小球在反弹前已经经过B点 (2).小球反弹后经过b点 对于1,直

West___wind的博客 1047

HDU 5572 (平面几何)

题目链接:点击这里题意: 平面上一个圆, 两个圆外的点A,B, 给A一个初速度, 问能否碰到B.根据AA的运行射线轨迹分成两种情况: 1. 如果运行时不撞到圆, 那么判断BB在射线上即可; 2. 如果撞到圆, 求出比较近的那个交点PP, 求出AA关于OPOP的对称点A′A', 那么判断BB在线段APAP或者射线PA′PA'上即可.#include <cstdio> #include <cmath

morejarphone~ 587

HDU 5572(圆的应用)

HDU 5572 题目 : An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description On an infinite smooth table, there’s a big round fixed cylinder and a little ball whose volume can be ignored. Curren

沐白白的博客 470

HDU 5572 An Easy Physics Problem (计算几何+对称点模板)

HDU 5572 An Easy Physics Problem (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5572 Description On an infinite smooth table, there's a big round fixed cylinder and a little ball whose volume c...

weixin_30808253的博客 114

hdu5572(计算几何)

An Easy Physics ProblemTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3497    Accepted Submission(s): 690Problem DescriptionOn an infinite smoo...

yypurpose的博客 539

hdu 5572

#include <iostream> #include <cstdio> #include <string.h> #include <algorithm> #include <map> #include <queue> #include <stdlib.h> #include <cmath> #include <vector> #include <stack>#define clr(x) mems

hzk123的博客 404

hdu 5572 An Easy Physics Problem

传送门; http://acm.hdu.edu.cn/showproblem.php?pid=5572上海区域赛铜牌题!!! 令我永生难忘的一道题,当时我们队就是被这道题一直卡着,直接导致最终打铁。。。。当时被气球颜色弄偏了,导致看了一道废题。。。。真的是战略出问题了。题意: 给出初始点和速度向量,有一个圆,和目标点,可以反弹,问最终能不能碰撞。计算几何题: 套一下板子,注意讨论就好了,要注

yp_2013的博客 692

HDU5572 2015ICPC上海A计算几何

题目 HDU 5572 无限大的平面上,有一个圆柱。圆柱外有两个点A、B,点A有个速度向量V,A撞到圆柱会发生完全弹性碰撞。问点A是否能经过点B。 解题思路 我们记A -> A+V的运动轨迹为直线 l1l1l1(射线在代码实现中并不好处理)。 共分以下几种情况: 一、 l1l1l1与圆不相交 判断A是否能直接经过B,即判断向量V⃗、B−A⃗\vec{V}、\vec{B-A}V、B−A​是否同向。 二、 l1l1l1与圆相切 情况同一。 三、 l1l1l1与圆相交 记l1l1l1与圆距离较近的点为X。

陈颜的博客 346

HDU 5572 An Easy Physics Problem【计算几何】

计算几何的题做的真是少之又少。 之前wa以为是精度问题,后来发现是情况没有考虑全。。。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5572题意:给定起点A和方向V,路径中遇到圆柱体会发生折射,问能否到达终点B。分析:将路径表示为a+t∗va + t * v得到关于tt的二元方程组,求出Δ\Delta。 Δ\Delta小于等于0时,表示不会发生折射

Tuesday 763

HDU 5572 An Easy Physics Problem 【直线与圆的关系】

传送门:HDU 5572 An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description On an infinite smooth table, there’s a big round fixed ...

Waiting For You 184

hdu 5572 桌球碰撞问题

传送门 点关于直线对称公式: 点( x , y )关于直线Ax + by + C = 0 的对称点( X , Y ): 设参数方程 联立圆方程得到关于t的一元二次方程 可见c>0恒成立 分两种情况讨论: 1.小球不反弹 2(1).小球在反弹前已经经过B点 (2).小球反弹后经过b点

twh233的算法blog 406

An Easy Physics Problem HDU - 5572 直线与圆

//#include //#pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #include #include #include using namespace std; const double pi=ac

Dream in the Night 322
上一篇: 向量模板
下一篇: 二维矩阵的一维访问方式
FightingForFinal
博客等级 码龄11年 24粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值