橢圓命中測試用單位圓正規化

判斷點是否在橢圓內,不要直接套橢圓方程式,把座標除以半軸長把問題壓縮成「點是否在單位圓內」:

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) / rxv = (p.y - cy) / ry 就變成單位圓方程式 u² + v² <= 1。幾何意義:把整個橢圓拉成圓、點也跟著被拉,點與橢圓的相對關係不變。

為什麼不直接寫橢圓方程式

數學上其實是同一件事,但分開寫的好處:

  • 可讀性dx² + dy² <= 1 一眼就知道是「圓內」測試,比 (x-cx)²/rx² + (y-cy)²/ry² <= 1 直覺
  • 可重用dxdy 中間量可以拿來算「距邊緣多遠」、「方向角」等其他判斷
  • 比較不會打錯字:少一層括號,少一個 ²

退化處理

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

同樣的「正規化 → 比較單位形狀」思路,可推廣到旋轉矩形、傾斜膠囊、任何仿射變形過的形狀。

相關