整定数の座標で与えられた画素 (dx, dy) (ただし、0 < dx, 0 ≦ dy/dx ≦ 1) に向かって原点から伸びる線分を表す連結画素列を、関数
plot_point を用いて順に出力するC言語のプログラムの一部を以下に示す。ただし、各行左端の数字は行番号でありプログラムには含まれない。
1 int x, y; float e;
2 e = (float)dy / (float)dx;
3 y = 0;
4 for (x = 0; x < dx; x++) {
5 plot_point(x, y);
6 if (e >= 0.5) {
7 y++; e = e - 1.0;
8 }
9 e = e + (float)dy / (float)dx;
10 }
11 plot_point (dx, dy);
このプログラムの中で、変数 e が現れる2、6、7、9行目では、浮動小数点数計算が必要であり、実行速度が低下してしまう。そこで、新たに int 型の変数 f を導入し
f = 2.0 * dx * (e - 0.5)
という変数変換を施せば、浮動小数点数 e の代わりに整数 f を更新するように、このプログラムを書き直すことができる。例えば、2行目は
f = 2 * dy - dx
となる。同様にして6行目を書き直したものはどれか。
@ if (f >= dx) {
A if (f <= 2*dx) {
B if (f >= 2*dx) {
C if (f <= 0) {
D if (f >= 0) {
D
f = 2.0 * dx * (e - 0.5) を変形すると
e - 0.5 = f / (2.0 * dx)
e = f / (2.0 * dx) + 0.5 となる。
6行目に代入すると
e = f / (2.0 * dx) + 0.5 ≧ 0.5
f / (2.0 * dx) ≧ 0
dx > 0 であるため、 f ≧ 0 となる。
ちなみに2行目は
e = f / (2.0 * dx) + 0.5 = dy / dx
f / (2.0 * dx) = dy / dx - 0.5
f = (dy / dx -0.5) * (2.0 * dx)
f = (dy / dx) * (2.0 * dx) - 0.5 * (2.0 * dx)
f = 2 * dy - dx によって変形されている。
W−1 | 目次 | W−3 |