私はまったく同じ問題を抱えていて、非常に簡単な解決策を見つけました。
public void drawLine(int x0, int y0, int x1, int y1, char ch) {
int dx = Math.abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
int dy = -Math.abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
int err = dx + dy, e2; // error value e_xy
for (;;) {
put(x0, y0, ch);
if (x0 == x1 && y0 == y1) break;
e2 = 2 * err;
// horizontal step?
if (e2 > dy) {
err += dy;
x0 += sx;
}
// vertical step?
if (e2 < dx) {
err += dx;
y0 += sy;
}
}
}
今あなたがしなければならないすべては二if
前else
を挿入することです:
public void drawLineNoDiagonalSteps(int x0, int y0, int x1, int y1, char ch) {
int dx = Math.abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
int dy = -Math.abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
int err = dx + dy, e2;
for (;;) {
put(x0, y0, ch);
if (x0 == x1 && y0 == y1) break;
e2 = 2 * err;
// EITHER horizontal OR vertical step (but not both!)
if (e2 > dy) {
err += dy;
x0 += sx;
} else if (e2 < dx) { // <--- this "else" makes the difference
err += dx;
y0 += sy;
}
}
}
を、それは2次元座標を増やす必要があるかどうかを判断するためだ場合通常、ブレゼンハムは、2つの連続があります今度は、アルゴリズムはもう一度、両方の座標を変更しません。 これを徹底的にテストしたわけではありませんが、うまく機能しているようです。
だけで、すべての行の任意の部分を含む細胞を使用するように確かに、それは簡単ですか? –
それは私が欲しいものです。しかし、私はそれの背後にある数学をどうやって理解できないのか分かりません。 –
行はどのように定義されていますか?スロープ長さ切片として?勾配 - 長さの初期点として? 2つのエンドポイントとして? –