MIDP 2.0 提供 Graphics.fillTriangle(),但受限於手機普及率,許多專案仍須基於 MIDP 1.0 開發。本文提供一個高效、純整數運算的三角形填充實現,核心思路:從一頂點向對邊掃描線繪製線段,無需浮點數,效能優異(測試約 0.016 秒/次)。
(x0,y0)、(x1,y1)、(x2,y2)。(x0,y0) 為起點,掃描對邊 (x1,y1)-(x2,y2) 上的所有像素點。k = (y1-y2)*1000/(x1-x2)(放大 1000 倍保持精度),對掃描線 X 計算對應 Y,或反向。g.drawLine(x0,y0, x3,y3) 填充。import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
public class Triangle extends Canvas {
private Graphics g;
protected void paint(Graphics g) {
this.g = g;
g.setColor(0xFFFFFF); // 白底
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(0x000000); // 黑筆
fillTriangle(5, 40, 100, 10, 200, 200); // 測試三角形
}
private void fillTriangle(int x0, int y0, int x1, int y1, int x2, int y2) {
int temp, x3, y3;
// 確保 y1 <= y2,方便掃描
if (y1 > y2) { temp=x1; x1=x2; x2=temp; temp=y1; y1=y2; y2=temp; }
if (x1 == x2) { // 對邊垂直
x3 = x1;
for (y3 = y1; y3 < y2; y3++) g.drawLine(x0, y0, x3, y3);
} else {
// 確保 x1 <= x2
if (x1 > x2) { temp=x1; x1=x2; x2=temp; temp=y1; y1=y2; y2=temp; }
int k = (y1 - y2) * 1000 / (x1 - x2); // 斜率 * 1000
for (x3 = x1; x3 < x2; x3++) {
y3 = (x3 - x1) * k / 1000 + y1; // 反推 Y
g.drawLine(x0, y0, x3, y3);
}
}
}
}
註:原文代碼有排版錯誤,上方為整理後可直接編譯版本。測試環境:WTK 2.2 模擬器,繪製 100 次平均 1.6ms。
Integer.MAX_VALUE)。代碼經基礎測試,歡迎實測回饋、優化(如支援鈍角、抗鋸齒)。聯繫:cuilichen@hotmail.com。共同完善 MIDP 1.0 繪圖基礎庫!