BrezLine
直線の書き方2
大きな数を掛けて、整数で足し算をしていきます。
割合は縦を基準に計算します。
int[] tateArr;
void calcLineTate(int p1x, int p1y, int p2x, int p2y)
{
int x16_x1 = p1x << 16;//16bit倍
int x16_y1 = p1y << 16;
int x16_x2 = p2x << 16;
int x16_y2 = p2y << 16;
int len = Math.abs(p2y - p1y) + 1;
int zouka_x = (x16_x2 - x16_x1) / len;
int zouka_y = (x16_y2 - x16_y1) / len;
int tmp_x = x16_x1;
int tmp_y = x16_y1;
for (int i = 0; i < len; i++, tmp_x += zouka_x, tmp_y += zouka_y)
{
tateArr[tmp_y >> 16] = tmp_x >> 16;
}
}
void drawLineTate(Vertex p1, Vertex p2, int[] pix)
{
tateArr = new int[hei];
int p1x = (int)p1.x + cenWid;//あらかじめ座標調節
int p1y = hei - (int)p1.y - cenHei;//マイナスの場合が出ないようにする。
int p2x = (int)p2.x + cenWid;
int p2y = hei - (int)p2.y - cenHei;
int startY, endY, startX, endX;//始点と到着点に区別
if (p1y < p2y) { startY = p1y; endY = p2y; startX = p1x; endX = p2x;}
else { startY = p2y; endY = p1y; startX = p2x; endX = p1x;};
calcLineTate(startX, startY, endX, endY);
int x1, y1;
for (int i = startY; i < endY; i++) {//描画
x1 = tateArr[i];
y1 = i;
pix[y1 * wid + x1] = 255 << 24 | 0 << 16 | 0 << 8 | 255;
}
}
2008年01月07日(月) 19:11:20 Modified by eruvasu