数学がわからなくてもなんとか誤魔化して通す方法
回転と平行移動を同時に考えることは難しいので, とりあえずどちらかを先に考えることとする.
とりあえず, 今回の問題にて特徴的である右目左目の制約 (同じ
他者の AC コードを見ると, 公式解説の複素数を使わずとも,
両目の
ここで,
数学がわからなくてもなんとか誤魔化して通す方法
回転と平行移動を同時に考えることは難しいので, とりあえずどちらかを先に考えることとする.
とりあえず, 今回の問題にて特徴的である右目左目の制約 (同じ
他者の AC コードを見ると, 公式解説の複素数を使わずとも,
両目の
ここで,
use proconio::input; | |
fn main() { | |
input! { | |
n: usize, | |
xy2: [(f64, f64); 2], | |
abn: [(f64, f64); n], | |
} | |
// ようわからんからとりあえず角度を二分探索してみる | |
let mut deg_min = 0.0f64; | |
let mut deg_max = 360.0f64; | |
let mut cnt = 0; | |
while (deg_max - deg_min) > 1e-10 && cnt < 100_000 { | |
let mid = (deg_max + deg_min) / 2.0; | |
let cos_r = (mid * std::f64::consts::PI / 180.0).cos(); | |
let sin_r = (mid * std::f64::consts::PI / 180.0).sin(); | |
let y0 = xy2[0].0 * sin_r + xy2[0].1 * cos_r; | |
let y1 = xy2[1].0 * sin_r + xy2[1].1 * cos_r; | |
if y1 - y0 > 0.0 { | |
deg_max = mid; | |
} else { | |
deg_min = mid; | |
} | |
cnt += 1; | |
} | |
let cos_r = (deg_max * std::f64::consts::PI / 180.0).cos(); | |
let sin_r = (deg_max * std::f64::consts::PI / 180.0).sin(); | |
let x0 = xy2[0].0 * cos_r - xy2[0].1 * sin_r; | |
let x1 = xy2[1].0 * cos_r - xy2[1].1 * sin_r; | |
let y0 = xy2[0].0 * sin_r + xy2[0].1 * cos_r; | |
let par_move_x = -(x0 + x1) / 2.0; | |
let par_move_y = -y0; | |
for ab in abn { | |
let cos_r = (deg_max * std::f64::consts::PI / 180.0).cos(); | |
let sin_r = (deg_max * std::f64::consts::PI / 180.0).sin(); | |
let xx = ab.0 * cos_r - ab.1 * sin_r + par_move_x; | |
let yy = ab.0 * sin_r + ab.1 * cos_r + par_move_y; | |
println!("{} {}", xx, yy); | |
} | |
} |