Siv3D / OpenSiv3D

C++20 framework for creative coding 🎮🎨🎹 / Cross-platform support (Windows, macOS, Linux, and the Web)
https://siv3d.github.io/
MIT License
1k stars 138 forks source link

Vec2::normalized_or(Vec2 v)などの追加 #1152

Closed comefrombottom closed 2 months ago

comefrombottom commented 9 months ago

追加する機能の内容 | Describe the solution you'd like Vec2::normalized_or(Vec2 v) 正規化する。ゼロベクトルの場合はvを返す。

https://discord.com/channels/443310697397354506/999983621408567326/1177667355749400617

その機能の追加によって解決する問題 | Is your feature request related to a problem? Please describe. //今まで Vec2 dir = enemy_pos-player_pos; Vec2 n=dir.isZero()?Vec2{0,0}:dir.normalized();

//改善後 Vec2 n=(enemy_pos-player_pos).normalized_or({0,0});

備考 | Additional context normalized_or({0,0})以外の用法としてはnormalized_or({1,0}),normalized_or(RandomVec2())などを想定

comefrombottom commented 8 months ago

getAngle_or(double angle), getAngle_or(Vec2 other,double angle)もあると統一的だと思った。_orより、ゼロベクトル時の挙動を決めるフラグを渡すようなオーバーロードを追加するのもあり。

Reputeless commented 2 months ago

Vec2::setLength(1.0) はゼロベクトルに対してゼロベクトルを返します。 これで良いかもと思うのですが、どうでしょう。

Reputeless commented 2 months ago

改めて考えてみて機運が高まったので v0.6.15 に入れようと思います。

Reputeless commented 2 months ago

そもそもゼロベクトルに対する .normalize() はゼロベクトルを返すのが世間のエンジンでは一般的のようで、そこから改め、ついでに .normalize_or(v) も加えようと思います。