Bresenham のアルゴリズムは、ピクセルなどの正方形のグリッドに線を描画するために使用されます。
このアルゴリズムの一部は、平面をオクタントと呼ばれる 8 つの部分に分割することに基づいています。
トリックは、対称性を使用して、2 番目のポイントがどこにあるかに関係なく、アルゴリズムを一般化することです。まず、最初の八分円に「移動」し、次に計算が行われ、最後に、生成されたポイントが元の八分円に変換されます。
ウィキペディアは、トリックを実行するための基本的な機能を提供します。
function switchToOctantZeroFrom(octant, x, y)
switch(octant)
case 1: return (x, y)
case 2: return (y, x)
case 3: return (y, -x)
case 4: return (-x, y)
case 5: return (-x, -y)
case 6: return (-y, -x)
case 7: return (-y, x)
case 8: return (x, -y)
さらに、次のことを行う必要があると書かれています。
入力と出力の座標系を反転する
これは、これらの転置が実際には退縮であるという事実に基づいています。f(f(x)) = x
あまり気にせずに、最初はうまくいくと思いました。
ただし、ケース 3 と 7 の場合は、退縮ではないため機能しません。
例えば:
Case 4: (-5, 1) => (5, 1) => (-5, 1) // Good
Case 3: (-1, 5) => (5, 1) => (1, -5) // Not good
もう一度トリックを実行する必要があります。
Case 3: (-1, 5) => (5, 1) => (1, -5) => (-5, -1) => (-1, 5) // Good
それで、私は何かを誤解しましたか?
それとも、ウィキペディアの記事の草稿の正確さの欠如であり、誰かがそれを改善する必要がありますか?
switchToOctant_onInput
2 つの関数を使用せずにこれらの遷移を行うより良い方法はありませんswitchToOctant_onOutput
か?