判斷橢圓(中心 (x0,y0)、X 半徑 rx、Y 半徑 ry)與矩形(左上 (xmin,ymin)、右下 (xmax,ymax))是否相交。避免浮點運算,全程使用 32-bit 整數運算,適合 J2ME 等無 FPU 環境。
橢圓方程式:(x/rx)² + (y/ry)² = 1。
兩邊同乘 (rx·ry)² 得整數判別式:
left = (dx·ry)² + (dy·rx)²
right = (rx·ry)²
若 left ≤ right 則點在橢圓內或邊界上。
true。(x,y):x = clamp(x0, xmin, xmax)y = clamp(y0, ymin, ymax)dx = x - x0、dy = y - y0。public static final boolean isCollide(int x0, int y0, int rx, int ry,
int xmin, int ymin, int xmax, int ymax) {
// 1. 圓心在矩形內
if (x0 >= xmin && x0 <= xmax && y0 >= ymin && y0 <= ymax) {
return true;
}
// 2. 最近點
int x = x0 < xmin ? xmin : (x0 > xmax ? xmax : x0);
int y = y0 < ymin ? ymin : (y0 > ymax ? ymax : y0);
// 3. 判別式
int dx = x - x0;
int dy = y - y0;
dx *= dx; dy *= dy;
rx *= rx; ry *= ry;
dx *= ry; dy *= rx;
return (dx + dy) <= (rx * ry);
}
rx, ry ≤ 46340 時 rx*ry 不會溢位 32-bit signed int。遊戲座標通常遠小於此值。rx = ry = radius 即為圓矩相交。此整數版橢圓矩形碰撞檢測兼顧效能與精度,是 J2ME 遊戲開發物理引擎的核心基石之一。