在無 GPU 加速的 J2ME 環境下,高效的軟件光柵化算法至關重要。本文記錄三大經典算法的數學推導與 Java ME 完整實現代碼,均已編譯驗證。
F(x,y) = ax + by + c = 0a = y0 - y1、b = x1 - x0、c = x0*y1 - x1*y0d = F(xp+1, yp+0.5)
d < 0:中點在線下方 → 選擇右上像素d >= 0:中點在線上方 → 選擇右像素d += ad += a + bd0 = a + 0.5b → 為避免浮點,使用 2*d 整數運算public void MidpointLine(Graphics g, int x0, int y0, int x1, int y1, int color) {
int a = y0 - y1;
int b = x1 - x0;
int d = 2*a + b; // 2*d0
int delta1 = 2*a; // 選右像素增量
int delta2 = 2*(a+b); // 選右上像素增量
int x = x0, y = y0;
g.setColor(color);
g.drawLine(x, y, x, y); // 畫起點
while (x < x1) {
if (d < 0) { // 選右上
x++; y++;
d += delta2;
} else { // 選右
x++;
d += delta1;
}
g.drawLine(x, y, x, y);
}
}
F(x,y) = x² + y² - R²M = (xp+1, yp-0.5) 判別:
F(M) < 0:內部 → 選 p1 (xp+1, yp)F(M) >= 0:外部 → 選 p2 (xp+1, yp-1)d += 2*xp + 3d += 2*(xp - yp) + 5d0 = 1.25 - R → 令 e = d - 0.25,得 e0 = 1 - Rpublic void MidpointCircle(Graphics g, int r, int color) {
int x = 0, y = r, d = 1 - r; // e0
g.setColor(color);
draw8Points(g, x, y); // 畫八個對稱點
while (x < y) {
if (d < 0) {
d += 2*x + 3;
x++;
} else {
d += 2*(x - y) + 5;
x++; y--;
}
draw8Points(g, x, y);
}
}
private void draw8Points(Graphics g, int x, int y) {
g.drawLine(x, y, x, y);
g.drawLine(y, x, y, x);
g.drawLine(-x, y, -x, y);
g.drawLine(-y, x, -y, x);
g.drawLine(-x, -y, -x, -y);
g.drawLine(-y, -x, -y, -x);
g.drawLine(x, -y, x, -y);
g.drawLine(y, -x, y, -x);
}
0 < k < 1(其他象限對稱處理)e 表示理論 y 與當前像素 y 的偏差e += k;e >= 0.5 時 y+1,e -= 1e' = 2*e*dx,初值 -dx,增量 2*dy,閾值 0public void BresenHam_Line(Graphics g, int x0, int y0, int x1, int y1, int color) {
int dx = x1 - x0;
int dy = y1 - y0;
int e = -dx;
int x = x0, y = y0;
for (int i = 0; i <= dx; i++) {
g.setColor(color);
g.drawLine(x, y, x, y);
x++;
e += 2*dy;
if (e >= 0) {
y++;
e -= 2*dx;
}
}
}
x1 > x0、|dy| <= dx),實際使用需添加象限判斷與座標變換Graphics.drawLine(x,y,x,y) 等效於畫點,性能可接受MutableImage 雙緩衝,減少閃爍掌握這三大算法,基本覆蓋了 J2ME 遊戲/圖形應用的基礎繪圖需求。