您的位置:首页 > 其它

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

2013-11-26 20:26 274 查看
题目链接:点击打开链接

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

题目分析: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: