DrawLine
直線の書き方
2次元配列上に、直線を直接描く方法について説明します。
基本的には、長い辺で短い辺を割り、短い辺の割合をだします。
その割合を長い辺がカウントされる度に足していき、
1を超えると短い辺が一つ増える、というアルゴリズムです。
以下にJavaでコードを書いて見ます。
無論、いろいろな書き方があり、次の書き方はその一つでしかありません。
また、最適化もされていません。
void drawLine(Vertex p1, Vertex p2)
{
if (p1.y < p2.y) { start.set(p1); edge.set(p2); }
else { start.set(p2); edge.set(p1); }
int yoko_no_nagasa = Math.abs(start.x - edge.x);
int tate_no_nagasa = Math.abs(start.y - edge.y);
int longEdge, shortEdge;
boolean migiagari = false;
if (start.x < edge.x) migiagari = true;
if (yoko_no_nagasa > tate_no_nagasa) //もし横が長ければ
{
longEdge = yoko_no_nagasa; shortEdge = tate_no_nagasa; //longは横
}
else //もし縦が長ければ
{
longEdge = tate_no_nagasa; shortEdge = yoko_no_nagasa; //shortは横
};
lineArr = new Vertex[longEdge]; //longの数だけ配列数確保
float wari = (float) shortEdge / longEdge;
int short_zouka = 0;//短い辺用の増加合計値
float wari_sum = 0;//割合合計
int henka = 0;//x(横)用の位置を入れる変数 右向きか左向きかで計算値が違うので
for (int i = 0; i < longEdge; i++) {
wari_sum += wari;
lineArr[i] = new Vertex();
if (yoko_no_nagasa > tate_no_nagasa) //もし横長であれば
{//横長なので、横がlongとなってカウントされ増えていく
if (migiagari==true) henka = start.x + i;
if (migiagari==false) henka = start.x - i;
if (Math.abs(henka) > cenWid) continue;//画面からはみ出てないか
lineArr[i].x = henka;//新しいXの位置を配列に代入
if (wari_sum > 1) { short_zouka++; wari_sum -= 1; };
if (Math.abs(start.y + short_zouka) > cenHei) continue;//画面からはみ出てないか
lineArr[i].y = start.y + short_zouka;//新しい縦の位置を代入
} else
{
if( Math.abs(start.y + i) > cenHei) continue;
lineArr[i].y = start.y + i;
if (wari_sum > 1) { short_zouka++; wari_sum -= 1; };
if (migiagari==true) henka = start.x + short_zouka;
if (migiagari==false) henka = start.x - short_zouka;
if (Math.abs(henka) > cenWid) continue;
lineArr[i].x = henka;
}
}
}
2007年12月24日(月) 18:56:20 Modified by eruvasu