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
© Copyright 2024 ExpyDoc