UVA 11880 (Ball in a Rectangle) 平面几何

本文介绍了一种处理矩形框内小球弹跳问题的算法,通过化曲为直的方法简化了计算过程,避免了复杂的模拟。详细解释了如何使用取模和解决函数来计算最终的圆心坐标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点击打开链接

题目大意:小球在矩形框内弹跳,速度不变,求最终的圆心坐标

题目分析:1.对边框进行处理,所以直接用圆心操作;

                    2.一开始以为是模拟,但是貌似很麻烦,仔细分析才发现是化曲为直的方法~利用取模


#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<math.h>
#define eps  1e-8
#define pi acos(-1.0)  //acos 为反余弦,cospi=-1
using namespace std;

int sgn(double x)
{
    return (x > eps) - (x < -eps);  //符号函数,貌似c++中没有这个= =手写
}
double solve(double x,double l)
{
    if(sgn(x)<0) x = -x;  
    if(sgn(x-l)>0) return 2*l-x;
    return x;
}
int main()
{
    double l,w, x,y,r,a,s,v,v_x,v_y;

    while(1)
    {
        scanf("%lf %lf %lf %lf %lf %lf %lf %lf ",&l,&w,&x,&y,&r,&a,&v,&s);
        if(sgn(l+w+x+y+r+a+v+s)==0)
            break;
        l-=2*r;
        w-=2*r;
        a=a/180*pi;
        
        v_x=cos(a)*v;     v_y=sin(a)*v;
        x=x-r+v_x*s;      y=y-r+v_y*s;
        x=fmod(x,2*l);    y=fmod(y,2*w);//才知道double也可以进行取模
        x=solve(x,l);     y=solve(y,w);
        printf("%.2lf %.2lf\n",x+r,y+r);

    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值