use rustraight::prelude::*;
fn approx_eq(a: f32, b: f32) -> bool {
(a - b).abs() < 1e-4
}
fn approx_eq_vec2(a: Vec2, b: Vec2) -> bool {
approx_eq(a.x, b.x) && approx_eq(a.y, b.y)
}
fn main() {
log_info!("--- Vec2 の基本演算 ---");
let x = Vec2::new(1.0, 0.0);
let y = Vec2::new(0.0, 1.0);
assert_eq!(x + y, Vec2::new(1.0, 1.0), "加算が不正");
assert_eq!(x - y, Vec2::new(1.0, -1.0), "減算が不正");
assert_eq!(x * 2.0, Vec2::new(2.0, 0.0), "スカラー倍が不正");
assert_eq!(Vec2::new(2.0, 3.0) * Vec2::new(4.0, 5.0), Vec2::new(8.0, 15.0), "要素ごとの積が不正");
assert_eq!(-x, Vec2::new(-1.0, 0.0), "単項マイナスが不正");
assert_eq!(x + Vec2::ZERO, x, "ZEROが加算の単位元でない");
log_info!("加減算・スカラー倍・要素ごとの積・単項マイナス OK");
log_info!("--- dot / cross / length サニティチェック ---");
assert_eq!(x.dot(y), 0.0, "直交ベクトルのdotが0でない");
assert_eq!(x.cross(y), 1.0, "x cross y が 1 にならない");
assert_eq!(x.length(), 1.0, "単位ベクトルのlengthが1でない");
log_info!("dot/cross/length OK");
log_info!("--- normalize ---");
let v = Vec2::new(3.0, 4.0);
assert_eq!(v.length(), 5.0, "3-4-5三角形のlengthが5でない");
assert!(approx_eq(v.normalize().length(), 1.0), "normalize後のlengthが1に近くない");
log_info!("normalize OK");
log_info!("--- perp(法線ベクトル) ---");
assert!(approx_eq(v.dot(v.perp()), 0.0), "perpがvと直交していない");
assert!(approx_eq(v.perp().length(), v.length()), "perpで長さが変わってしまっている");
assert_eq!(x.perp(), y, "xのperpがyにならない(反時計回り90度回転のはず)");
log_info!("perp OK");
log_info!("--- rotate / from_angle ---");
let rotated = x.rotate(std::f32::consts::FRAC_PI_2);
assert!(approx_eq_vec2(rotated, y), "xをπ/2回転してもyに近づかない");
assert!(approx_eq_vec2(rotated, x.perp()), "π/2回転とperpの結果が一致しない");
assert!(approx_eq_vec2(Vec2::from_angle(0.0), x), "from_angle(0)がxにならない");
assert!(approx_eq_vec2(Vec2::from_angle(std::f32::consts::FRAC_PI_2), y), "from_angle(π/2)がyに近くない");
log_info!("rotate/from_angle OK");
log_info!("全チェックOK: geometry2d は期待通りに動作している");
}