rustraight 0.6.4

A simple 2D game library for Rust, inspired by DXLib
// 2D数学ユーティリティ(geometry2d)の動作確認用サンプル。ウィンドウ初期化不要、アセット不要。
//
// 確認対象:
//   Vec2(加減算・スカラー倍・要素ごとの積・単項マイナス・dot・cross・length・normalize・perp・rotate・from_angle)
//
// コンソール出力のみで完結するため `cargo run --example 14_geometry2d` でそのまま確認できる。

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 は期待通りに動作している");
}