台球碰撞
在平面直角坐標系下,臺球桌是一個左下角在(0,0),右上角在(L,W)的矩形。有一個球心在(x,y),半徑為R的圓形母球放在臺球桌上(整個球都在臺球桌內)。受撞擊后,球沿極角為a的射線(即:x正半軸逆時針旋轉到此射線的角度為a)飛出,每次碰到球桌時均發生完全彈性碰撞(球的速率不變,反射角等于入射角)。
如果球的速率為v,s個時間單位之后球心在什么地方?
輸入
輸入文件最多包含25組測試數據,每個數據僅一行,包含8個正整數L,W,x,y,R,a,v,s(100<=L,W<=105, 1<=R<=5, R<=x<=L-R, R<=y<=W-R, 0<=a<360, 1<=v,s<=105),含義見題目描述。L=W=x=y=R=a=v=s=0表示輸入結束,你的程序不應當處理這一行。
輸出
對于每組數據,輸出僅一行,包含兩個實數x, y,表明球心坐標為(x,y)。x和y應四舍五入保留兩位小數。
__
樣例輸入
100 100 80 10 5 90 2 23
110 100 70 10 5 180 1 9999
0 0 0 0 0 0 0 0
樣例輸出
80.00 56.00
71.00 10.00
思路
這道題的主要思路是把原本圓形的碰撞轉換成了圓心的碰撞,由原本不規則的碰撞變成了規則的碰撞,并且圓心的運動軌跡是一個規則的矩形
#include<iostream> #include<string> #include<math.h> #include<stdio.h> using namespace std;int main(){double l, w, x, y, r, a, v,s;while(cin>>l>>w>>x>>y>>r>>a>>v>>s){if(l== 0&&w== 0)//這里只要l, w為0便可以停止了break;l-= r;w-= r;a= a/180*acos(-1.0);//將角度轉換為弧度double Sx= v*cos(a)*s+ x;//將速度延x軸和y軸分解double Sy= v*sin(a)*s+ y;while(Sx< r||Sx> l){//如果超出了限制的范圍則作對稱變換//模擬碰撞if(Sx< r)Sx= r* 2- Sx;if(Sx> l)Sx= l*2- Sx;}while(Sy< r|| Sy> w){if(Sy< r)Sy= r*2- Sy;if(Sy> w)Sy= w*2- Sy;}printf("%.2lf %.2lf\n", Sx, Sy);}return 0; }總結
- 上一篇: 大学生PHP搜题软件,大学最强的搜题软件
- 下一篇: 教你如何处理加速电脑速度(转载)