湖南省第六届程序设计大赛D(台球碰撞)

虽然这道题没有用什么算法,但却锻炼了思维

//矢量分解
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double l,w,x,y,r,a,v,s;
int main()
{
	while(cin>>l>>w>>x>>y>>r>>a>>v>>s)
	{
		if(!l&&!w&&!x&&!y&&!r&&!a&&!v&&!s) break;
		l-=2*r;w-=2*r;
		x-=r;y-=r;//相应坐标也要变换
		a=a*acos(0.0)/90;
		double vx=v*cos(a),vy=v*sin(a);
		double dx=fmod(fmod(vx*s,2*l)+2*l,2*l);//其实包括了两部分,向正方向和向负方向,为了code的方,把两种情况统一为向正方向。
		                                       //fmod(vx*s,2*l)如果为负值,说明是向着负方向走i米,也就相当于向着正方向走了(2*l-i)米
		double dy=fmod(fmod(vy*s,2*w)+2*w,2*w);
		if(x+dx<=l) x+=dx;
		else if(x+dx<=2*l) x=l-(x+dx-l);
		else x=x+dx-2*l;
		if(y+dy<=w) y+=dy;
		else if(y+dy<=2*w) y=w-(y+dy-w);
		else y=y+dy-2*w;
		printf("%.2lf %.2lf\n",x+r,y+r);
	}
	return 0;
}


原文地址:https://www.cnblogs.com/lj030/p/3002271.html