1

私は基本的にブレゼンハムの円の描画の帰結に興味がありますが、最終結果がY(垂直)平面上の平らな円である3Dパースペクティブです。この種の魔法のDDAタイプのアルゴリズムはありますか?

DDAとは、主なボトルネックはパースペクティブ除算であるため、主に整数を使用し、できるだけ多くの乗算と除算を回避することを意味することに注意してZください。

これまでに思いついたのは、360 度を一定の増分でループし、投影された座標と増分に基づいて次の座標との間に線を引くことです。下の画像は、23 度の増分を使用したテストです (私は 22.5 を使用しますが、これは 1 度の精度のみで整数ルックアップから機能します)。

23 度刻みの線を使用して描かれた円

このための疑似コードは次のようになります。

for (degree = 0; degree < 360; degree += degree_inc) {
    z1 = z + radius * cos(degree)
    x1 = x + radius * sin(degree)
    y1 = y

    next_degree = degree + degree_inc
    if (next_degree >= 360) {
        next_degree = 0;
    }
    z2 = z + radius * cos(next_degree)
    x2 = x + radius * sin(next_degree)
    y2 = y

    line(project_x(x1,z1), project_y(y1,z1),
         project_x(x2,z2), project_y(y2,z2))
}

明らかに、実際のコードには多くの小さな最適化 (ルックアップ テーブルと事前計算された量) がありますが、これがその本質です。

乾杯!

4

0 に答える 0