中点線画
基本的なアルゴリズム:
現在のピクセルポイントは(xp、yp)で、次のピクセルポイントはP1またはP2です。M=(xp + 1、yp + 0.5)を設定します。これはp1とp2の間の
中点、Qは理想的な直線であり、x = xp + 1垂直線の交点。QとMのy座標を比較します。
MがQ未満の場合、P2は次のピクセルポイント、
MはQより上、P1は次のポイント
判別式を作成します。d= F(M)= F(xp + 1、yp + 0.5)= a(xp + 1)+ b(yp + 0.5)+ cここで、a = y0-y1、
b = x1-x0、 c = x0y1-x1y0
d <0の場合、MはLの下(Qポイント)、右上のP2を次のピクセルとし
、d> 0の場合、MはL(Qポイント)の上、右のP1を次のピクセルとします。ピクセル;
d = 0の場合、P1またはP2のいずれかを選択でき、P1が次のピクセルであることに同意します。
現在のピクセルがd³0にある場合、正の右ピクセルP1(xp + 1、yp)が取得されます。次のピクセルの位置を決定するには、d1 = F(xp + 2、yp + 0.5)= a(xp + 2 )+ b(yp + 0.5)= d + a;増分はa
d <0の場合、右上のピクセルP2(xp + 1、yp + 1)を取得します。次のピクセルを判断するには、
d2 = F(xp + 2、yp + 1.5)= a(xp + 2)+ b(yp + 1.5)+ c = d + a + b を計算する必要があります。増分はa + bです。
**線画は(x0、y0)から始まり、d d0 = F(x0 + 1、y0 + 0.5)= F(x0、y0)+ a + 0.5b = a + 0.5bの初期値です。
dの代わりに2dを使用して小数を取り除き、効率を向上させることができます。**
例:中点の描画方法
a = y1-y2 = -2 b = x2-x1 = を使用して直線セグメントP1(0、0)—P2(5、2)を描画します。5
d0 = 2a + b = 1 d1 = 2a = -4 d2 = 2(a + b)= 6
アルゴリズム:
void Midpoint Line (int x0,int y0,int x1, int y1,int color)
{
int a, b, d1, d2, d, x, y;
a=y0-y1, b=x1-x0, d=2*a+b;
d1=2*a, d2=2* (a+b);
x=x0, y=y0;
drawpixel(x, y, color);
while (x<x1)
{
if (d<0)
{
x++, y++, d+=d2;
}
else
{
x++, d+=d1;
}
drawpixel (x, y, color);
} /* while */
} /* mid PointLine */