题目链接:点击打开链接
题目大意:小球在矩形框内弹跳,速度不变,求最终的圆心坐标
题目分析: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;
}