作者DJWS (...)
看板Prob_Solve
标题Re: [问题] Google Code Jam 2008, EMEA Semifinal-A
时间Sun Apr 1 20:53:00 2012
方才发现第一名的做法比较简洁
这边节录一下他的程式码
说明在最下面
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)
1F:推 RockLee:感谢 D 大的补充说明 :) 04/02 00:30