ドット絵エディタを作る(ブレゼンハムで直線だ編)
ねみぃ…
// fromX, fromY : 始点
// toX, toY : 終点
// x, y : 色を塗るピクセル座標
// dX, dY : 始点から終点への距離
//距離を求める(dx,dy がそれぞれの軸の距離になります)
dx := toX - fromX ;
dy := toY - fromY ;
if ( dx < 0 ) then ax := -1 else ax := 1 ;
if ( dy < 0 ) then ay := -1 else ay := 1 ;
dx := abs( dx ); //絶対値
dy := abs( dy );
// 表示先のピクセル座標を求める.
count := 0 ;
x := fromX ;
y := fromY ;
// X方向とY方向とで距離に応じて場合分け.
if ( dX >= dY ) then begin
i := 0 ;
while ( i < dX ) do begin
// この段階での x, y が直線上の点になるので,
// この座標上に色を塗ればOK.
// 例えば,FBackBmp.Canvas.Pixcels[x,y] := RGB(0,0,0);
inc( x, aX );
inc( count, dY );
if ( count >= dX ) then begin
inc( y, aY );
dec( count, dX );
end;
inc( i );
end;
end else begin
i := 0 ;
while ( i < dY ) do begin
// この段階での x, y が直線上の点になるので,
// この座標上に色を塗ればOK.
// 例えば,FBackBmp.Canvas.Pixcels[x,y] := RGB(0,0,0);
inc( y, aY );
inc( count, dX );
if ( count >= dY ) then begin
inc( x, aX );
dec( count, dY );
end;
inc( i );
end;
end;
む,むぅ…for i:=1 to 0 do begin ・・・ end;なんて書こうもんなら,カナリやばいねー.半暴走だねー.
// fromX, fromY : 始点
// toX, toY : 終点
// x, y : 色を塗るピクセル座標
// dX, dY : 始点から終点への距離
//距離を求める(dx,dy がそれぞれの軸の距離になります)
dx = toX - fromX ;
dy = toY - fromY ;
ax = ( dx < 0 )? -1 : 1 ;
ay = ( dy < 0 )? -1 : 1 ;
dx = abs( dx ); //絶対値
dy = abs( dy );
// 表示先のピクセル座標を求める.
int count = 0 ;
int x = fromX ;
int y = fromY ;
// X方向とY方向とで距離に応じて場合分け.
if ( dX >= dY )
{
for ( i=0 ; i < dX ; ++i )
{
// この段階での x, y が直線上の点になるので,
// この座標上に色を塗ればOK.
// 例えば,FBackBmp.Canvas.Pixcels[x,y] := RGB(0,0,0);
x += aX ;
count += dY ;
if ( count >= dX ){
y += aY ;
count += dX ;
}
}
}
else
{
for ( i=0 ; i < dY ; ++i )
{
// この段階での x, y が直線上の点になるので,
// この座標上に色を塗ればOK.
// 例えば,FBackBmp.Canvas.Pixcels[x,y] := RGB(0,0,0);
y += aY ;
count += dX ;
if ( count >= dY ) {
x += aX ;
count += dY ;
}
}
}
むおぉお,すっきりー