Kick Ass Biu

来源:互联网 发布:日本网络电视jitakutv 编辑:程序博客网 时间:2024/06/05 20:10


点击打开链接

在玩Kick Ass的时候,可以发现子弹的发射与飞船的移动非常有趣。

假设屏幕是个n×mn×m(竖直为n,水平为m)的矩形,以矩形左下角为原点,水平方向为x轴,向右为正方向,竖直方向为y轴,像上为正方向,建立平面直角坐标系。你的飞船在(x1,y1)点,射击目标在(x2,y2),你向目标发出了一发子弹,然而由于网页卡顿,这枚子弹并不会触碰到目标。所以,子弹将以每秒v单位的速度继续前进,若子弹移动到屏幕边缘,将自动传送到另一边并继续移动。如:向右移动到(m,0)则下一刻从(0,0)开始继续移动,同理向上移动到(0,n)则下一刻从(0,0)开始继续移动。

现在给出nm(x1,y1)(x2,y2)v,能否通过编程回答第t秒子弹的坐标?

输入

多组测试数据,请处理到文件结束。

第一行是两个正整数nm

第二行是六个正整数x1y1x2y2vt

0<n,m<1000000<n,m<100000

0<x1y1x2y2vt<1000000<x1,y1,x2,y2,v,t<100000

输出

对于每组测试数据请在一行输出第t秒子弹的坐标xy,中间用一个空格隔开。

结果四舍五入保留到小数点后一位

样例输入

3 31 1 1 2 1 13 31 1 1 2 1 23 31 1 1 2 1 3

样例输出

1.0 2.01.0 0.01.0 1.0


不算太难的几何题,主要麻烦的是遇见边界需要转移。

这种简单几何题往往可以从多种角度求解。

首先求出t秒不考虑转移可以走的路程长度,即v*t,然后由相似三角形性质可以得出长度在x轴上和y轴上的投影。

剩下的只需要减去多余的部分,即可得到t秒后子弹的坐标。

#include<cstdio>#include<cmath>double dis(double x1,double y1,double x2,double y2){    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}double change(double x,double t) {    while(x>=t) {        x-=t;    }    return x;}double tabs(double m) {    return m>0?m:-m;}int main() {    double n,m;    while(scanf("%lf %lf",&n,&m)!=EOF) {        double x1,y1,x2,y2,v,t;        scanf("%lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&v,&t);        double s=v*t;//走过的路程         double st=dis(x1,y1,x2,y2);//两点间的距离         double lx=tabs(x2-x1)*(s/st); //走过多少个x1-x2        if(x2>x1)            lx=change(lx+x1,m);        else            lx=m-change(m-x1+lx,m);        double ly=tabs(y2-y1)*(s/st);        if(y2>y1)            ly=change(ly+y1,n);        else            ly=n-change(n-y1+ly,n);        printf("%.1lf %.1lf\n",lx,ly);    }    return 0;}