橢圓命中測試用單位圓正規化
判斷點是否在橢圓內,不要直接套橢圓方程式,把座標除以半軸長把問題壓縮成「點是否在單位圓內」:
dx = (p.x - cx) / rx
dy = (p.y - cy) / ry
inside = dx * dx + dy * dy <= 1
原理
橢圓方程式:
((p.x - cx) / rx)² + ((p.y - cy) / ry)² <= 1
換元 u = (p.x - cx) / rx、v = (p.y - cy) / ry 就變成單位圓方程式 u² + v² <= 1。幾何意義:把整個橢圓拉成圓、點也跟著被拉,點與橢圓的相對關係不變。
為什麼不直接寫橢圓方程式
數學上其實是同一件事,但分開寫的好處:
- 可讀性:
dx² + dy² <= 1一眼就知道是「圓內」測試,比(x-cx)²/rx² + (y-cy)²/ry² <= 1直覺 - 可重用:
dx、dy中間量可以拿來算「距邊緣多遠」、「方向角」等其他判斷 - 比較不會打錯字:少一層括號,少一個
²
退化處理
if (rx <= 0 || ry <= 0) return false橢圓半軸為 0 時整個塌成線或點,命中測試直接回 false 比較安全(不然會除以 0 變 NaN)。
延伸:旋轉的橢圓
若橢圓有旋轉角 θ,先把點繞中心反向旋轉 -θ 變回正橢圓,再套上面公式:
local = rotate(p - center, -θ)
dx = local.x / rx
dy = local.y / ry
inside = dx² + dy² <= 1
同樣的「正規化 → 比較單位形狀」思路,可推廣到旋轉矩形、傾斜膠囊、任何仿射變形過的形狀。