Re: [問題] Google Code Jam 2008, EMEA Semifinal-A
看板Prob_Solve (計算數學 Problem Solving)作者DJWS (...)時間12年前 (2012/04/01 20:53)推噓1(1推 0噓 0→)留言1則, 1人參與討論串3/3 (看更多)
方才發現第一名的做法比較簡潔
這邊節錄一下他的程式碼
說明在最下面
typedef complex<double> pnt;
int main()
{
int cases;
cin >> cases;
for (int cas = 0; cas < cases; cas++)
{
printf("Case #%d: ", cas + 1);
pnt ta[3], tb[3];
for (int i = 0; i < 3; i++)
cin >> ta[i].real() >> ta[i].imag();
for (int i = 0; i < 3; i++)
cin >> tb[i].real() >> tb[i].imag();
pnt ea = ta[1] - ta[0];
pnt eb = tb[1] - tb[0];
pnt s = eb / ea;
pnt t = tb[0] - s * ta[0];
pnt ans = t / (1.0 - s);
printf("%.7f %.7f\n", ans.real(), ans.imag());
}
return 0;
}
首先計算出縮放量、旋轉量、位移量
上面程式碼當中
pnt是一個複數,作者用實部存X座標,用虛部存Y座標
ea和eb是兩個三角形對應的邊,形成的向量 =========> 複數相減,就是實部相減&虛部相減,剛好和二維向量減法一樣
s是縮放量+旋轉量 ========> 複數相除,就是長度相除&角度相減
t是位移量
當一個點縮放、旋轉、位移之後,仍舊是同一點的話,
那一點就是答案了!
寫成方程式就是 ans * s + t = ans
移項一下就是 ans = t / (1 - s)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.230.128.138
※ 編輯: DJWS 來自: 61.230.128.138 (04/01 21:00)
推
04/02 00:30, , 1F
04/02 00:30, 1F
討論串 (同標題文章)
Prob_Solve 近期熱門文章
PTT數位生活區 即時熱門文章