Bresenham の線画アルゴリズムでエラー累積部分がどのように機能するかを理解するのに問題があります。
と があるx1
としx2
ます。簡単にするためx1 < x2
に、 、y1 < y2
、および と仮定しましょう。(x2 - x1) >= (y2 - y1)
線を引く単純な方法から始めましょう。次のようになります。
void DrawLine(int x1, int y1, int x2, int y2)
{
float y = y1 + 0.5f;
float slope = (float)(y2 - y1) / (x2 - x1);
for (int x = x1; x <= x2; ++x)
{
PlotPixel(x, (int)y);
y += slope;
}
}
もっとブレゼンハム風にして、y の整数部分と浮動小数点部分を分けてみましょう。
void DrawLine(int x1, int y1, int x2, int y2)
{
int yi = y1;
float yf = 0.5f;
float slope = (float)(y2 - y1) / (x2 - x1);
for (int x = x1; x <= x2; ++x)
{
PlotPixel(x, yi);
yf += slope;
if (yf >= 1.0f)
{
yf -= 1.0f;
++yi;
}
}
}
この時点で、乗算yf
しslope
て2 * (x2 - x1)
整数にすることができ、浮動小数点数はなくなります。という事は承知しています。
私が完全に理解していない部分は次のとおりです。
if (yf >= 1.0f)
{
yf -= 1.0f;
++yi;
}
それは実際にどのように機能しますか?なぜ 1.0 と比較してから減分するのですか?
Bresenham の基本的な質問は、次のようなものであることは知っています。現在ピクセルx, y
を使用していて、次のピクセルを描画したい場合、または を選択する必要がありますx + 1, y
かx + 1, y + 1
? - その小切手が、この質問に答えるのにどのように役立つのか理解できません.
それをエラー用語と呼ぶ人もいれば、しきい値と呼ぶ人もいますが、それが何を表しているのかわかりません。
説明をいただければ幸いです。