次の方式で画素にメモリを割り当てる640×480のグラフィックLCDモジュールがある。
座標(x,y)で始点(5,4)から終点(9,8)まで直線を描画するとき,直線上のx=7の画素に割り当てられたメモリのアドレスの先頭は何番地か。
〔方式〕
・メモリは0番地から昇順に使用する。
・1画素は16ビットとする。
・座標(0,0)から座標(639,479)まで連続して割り当てる。
・各画素は,x=0からx軸の方向にメモリを割り当てていく。
・x=639の次はx=0とし,yを1増やす。
(図:メモリと座標(x,y)グリッドの対応図。0番地から順にx方向に画素を割り当て、始点(5,4)から終点(9,8)までの直線が示されている。)
正答3
解説
正解は3です。
この問題は、画素ごとに連続してメモリを割り当てる方式で、直線上の画素のアドレスを求めるものです。
図では、メモリの1番地が8ビットで、1画素(16ビット)に0番地と1番地の2番地分が対応しています。
始点(5,4)から終点(9,8)までの直線は、黒い丸が右下へ斜めに1つずつ並んでおり、xが1増えるとyも1増えます。
【計算】
直線上ではxとyが同じだけ増えるので、x=7のとき y=4+(7-5)=6 です。
y行目の先頭までには 640×y個の画素があり、その後ろにx番目の画素が続きます。
(7,6)の画素は、0から数えて 640×6+7 = 3,847番目です。
1画素は16ビットで、1番地は8ビットなので、1画素に2番地を使います。
先頭アドレスは 3,847×2 = 7,694番地です。
【選択肢別解説】
1:× 3847番地は画素の通し番号そのものです。
1画素が2番地分を使うことを考慮しておらず、2倍する必要があります。
2:× 7680番地は640×6×2で、y=6の行の先頭(x=0)の画素のアドレスです。
x=7の分の7×2=14番地が加算されていません。
3:○ (640×6+7)×2=7,694番地で、x=7、y=6の画素の先頭アドレスです。
4:× 8978番地を2で割ると4,489番目の画素で、640×7+9からy=7、x=9の位置に当たります。
直線上のx=7の画素ではありません。
【ポイント】
2次元の画素をメモリに並べるときの通し番号は「y×横の画素数+x」です。
最後に1画素当たりの番地数(バイト数)を掛けるのを忘れないようにしましょう。