Wiki内検索
最近更新したページ
2011-08-24
2010-05-18
2010-05-03
2010-02-18
2010-02-10
2010-02-09
2010-02-08
2010-02-07
2010-02-02
2009-12-24
2009-12-05
2009-07-05
2009-07-03
最新コメント
MenuBar1 by stunning seo guys
MenuBar1 by stunning seo guys
MenuBar1 by stunning seo guys
MenuBar1 by awesome things!
MenuBar1 by awesome things!
MenuBar1 by awesome things!
MenuBar1 by check it out
MenuBar1 by awesome things!
MenuBar1 by check it out
MenuBar1 by stunning seo guys
Menu
Programming Tips
タグ

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




スマートフォン版で見る