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

14 篇文章 0 订阅
1 篇文章 0 订阅

题目链接:点击打开链接

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

题目分析: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值