ラスターグラフィックスの基本

Bresenhamのアルゴリズムについて
ラスターグラフィックスの基本
• ディスプレイはデジタル表示が一般的
• 直線も曲線も離散的に表示(点列表示)
• 高速描画(高速アルゴリズム)が要求される
• ベクター表示する可能な全てのデバイスに
組み込まれる
• 直線はBresenham, 円弧はMichenerのアル
ゴリズムが使われている
画素中間の上下どちらを真の直線が通過するか
1
Bresenhamアルゴリズムの考え方
dx= x2ーx1, dy= y2 ーy1
(x2,y2)
傾き:
d=dy/dx
①演算(x<x2の間中、
①②③を繰返す)
初期誤差:
e=0
(x1,y1)
d
1
初期出力:
(x1,y1)をプロット, x=x1,y=y1
d
x=x+1, e=e+d
②判別式:
e> 12 のとき:
y=y+1, e=eー1 とする
③出力
(x,y)をプロット
3
Bresenhamのアルゴリズムのまとめ
(x2,y2)
2
アルゴリズムの高速演算化
式に 2dx を掛けて整数化, 判定を正負で行う
(x2,y2)
傾き:d=2dy
(x<x2の間)
d
(x1,y1)
d
ーdx
2dx
2.判別式:
e>0のとき:y=y+1,
e=eー2dx
とする
2dx
初期出力:
(x1,y1)をプロット, x=x1,y=y1
3.出力
(x,y)をプロット
4
適用領域の拡張のための変数置き換え(1/5)
dx= x2ーx1, dy= y2 ーy1 , d2=2*dx
全ての入れ替えを重ねる
(x1,y1)
y=-x
1.初期化
(x1,y1)をプロット, d=2dy, e=ーdx , x=x1, y=y1
(終点は周辺)
x1とx2を
入れ替え
る範囲
2.繰り返し演算(x<x2が成り立つとき)
2.1 x=x+1, e=e+d
2.2 もし e>0 ならば、y=y+1, e=eーd2
2.3 (x,y)をプロット
但し、0≦ y2ーy1 ≦ x2ーx1 のときのみ有効
1.繰り返し演算:
x=x+1, e=e+d
初期誤差:
e=ーdx
(始点は中心)
y1とy2を入れ
替える範囲
y=x
5
xとyを入れ替える範囲
6
1
適用領域の拡張のための変数置き換え(2/5)
x1>x2 のとき x1とx2を入れ替える
適用領域の拡張のための変数置き換え(3/5)
y1>y2 のとき y1とy2を入れ替える
(終点は周辺)
(始点は中心)
(始点は中心)
x1とx2を
入れ替える範囲
(終点は周辺)
y1とy2を入れ替
える範囲
y=-x
y=-x
y=x
y=x
7
8
適用領域の拡張のための変数置き換え(4/5)
適用領域の拡張のための変数置き換え(5/5)
|y1ーy2|>|x1ーx2|のときxとyを入れ替える
x1>x2のとき x1とx2を入れ替える、表示点は x1+x2-x
y1>y2のとき y1とy2を入れ替える、表示点は y1+y2-y
(終点は周辺)
y=xの直線
入れ替え後のxyの範囲
(始点は中央、終点は周辺)
(始点は中心)
xとyを入れ替える範囲
|y2ーy1|>|x2ーx1|のときxとyを入れ替える
表示点では、xとyを入れ替える
y=x
y=-x
9
10
適用領域の拡張のための変数交換(1/4)
適用領域の拡張のための変数交換(2/4)
x2 (交換)
変換前 x: x1→x2
終点
変換後
x': x2→x1
アルゴリズムの動作
(x2,y2)
(x',y) (x ,y )
x'=a*x+b とすると
1 2
x2=a*x1+b
プロット点
x1=a*x2+b より
(x1+x2-x', y)
x1>x2 の場合
(x2,y1)
x1
(x1,y1)
始点
a=-1,b=x1+x2
これより
x =x1+x2- x'
の場合
11
y1
y2 xとyを交換
終点 (x2,y2)
プロット点(y, x)
(y2,x2)
(x, y):アルゴリズムの出力点
(y1,x1)
直線:y=xに
線対称
y1>y2 の場合でも同様
x1
x2
y2ー y1 > x2ー x1 > 0
x: y1→y2
y: x1→x2
始点
(x1,y1)
12
2
適用領域の拡張のための変数交換(3/4)
可換
複数の置き換え
① x1 x2 交換
② y1 y2 交換
x
y1
③ x1
y2
2
プロットする点
①
x1+x2-x
y1+y2ーy
(y,x)
適用領域の拡張のための変数交換(4/4)
③ x1とy1の交換
x2とy2の交換
x成分とy成分を
交換してプロット
y=-x
始点
(x1,y1)
最終
プロット点
① x1とx2 を交換
x1+x2-x
でプロット
② y1と y2 交換
アルゴリズム ②
出力点(x, y)
③
終点
(x2,y2)
y=x
13
14
Michenerの円弧アルゴリズムの考え方
x位置の画素から(x+1)の画素の描画へ
x2+y2=r2
P
y
n
n-1
y1+y2ーyでプロット
x
OP2=x2+n2>r2
r
0
y-1
R
Q
45
°
3
2
1
Q
y
OQ2=x2+(n-1)2<r2
x
x
判別式:
D=(OP2ーr2)+(OQ2ーr2)
正ならばQを、
負ならばPを選択
1. xからx+1への移動時の判定式:d1
x
x+1 x+2
Q
y-1
2.x+1からx+2への移動時の判定式:d2
d1≧0,
d2≧0
<0ならばQ
16
d1<0 のとき: x+1からx+2への移動時の判定式:d2
真円
y
d1≧0の
とき
d1≧0,
d2<0
d1=eQ+eR ≧0ならばR
最適なy座標値の判定式(1/2)
xからx+1、x+1からx+2の2段階の移動を考える
d1<0,
d2≧0
真円
2次式であり、計算時間がかかる
判定式を高速に計算するために
d1<0,
d2<0
eQ
eR
eQ=(x+1)2+y2ーr2
eR=(x+1)2+(yー1)2ーr2
xから(x+1)に移るときの判定式 d1 は
d1=2(x+1)2+y2+(yー1)2ー2r2
15
d1<0の
とき
x+1
R
なぜなら
17
d2=(x+2)2+y2ーr2
+(x+2)2+(yー1)2ーr2
=d1+4x+6
となる
d1=2(x+1)2+y2+(yー1)2ー2r2
18
3
最適なy座標値の判定式(2/2)
d1≧0 のとき:x+1からx+2への移動時の判定式:d2
真円
y
x
x+1 x+2
y-1
Q
y-2
d2=(x+2)2+(yー1)2ーr2
+(x+2)2+(yー2)2ーr2
=d1+4(xーy)+10
となる
R
なぜなら
d1=2(x+1)2+y2+(yー1)2ー2r2
x=0からr/√2 まで、半径rの
1/8円弧をプロットする
円の方程式:x2+y2 =r2
x0=0; y0=r;
P0(x0,y0)
Q
R
まず最初の判別式d1を求める
d1=eQ1+eR1
0
=(x0+1)2+y02-r2
+(x0+1)2+(y0-1)2-r2
=1+r2-r2+1+(r-1)2-r2
(∵ x0=0,y0=r)
=3-2r
19
Michenerアルゴリズムのまとめ
(中心が原点の場合に1/8円をプロット)
1.初期化 x=0, y=r, d=3ー2r, (x,y)をプロット
2.繰り返し計算(x<yが成り立つ間)
もし(d<0)ならば、d=d+4x+6
2.1
そうでなければ、d=d+4(xーy)+10, y=yー1
2.2 x=x+1
y
2.3 (x,y)をプロット
0
x
21
X
20
適用領域の拡張のための変数追加
(-x,y)
(y,-x)
y
アルゴリズムの
出力点(x, y)
(y, x)
(x, y)が円周上の点ならば
x
0
(-y,-x)
y=x (-x,-y)
に線対称
(-y, x)
(x,-y)
(±x, ±y),(±y, ±x)も
同様に円周上の点
中心が(x0,y0)の円を描くには(x,y)の代わりに、
(x0±x,y0±y),(x0±y,y0±x)にプロットする
複号任意 (合計8通りある)
22
4