2016-04-13 14 views
1

私はJavascriptでスキャンラインアルゴリズムを実装しようとしています。私のxの計算は線が短くても長くても間違っているようです。これらのエッジが満たされるべきスキャンラインアルゴリズム:エッジのxを計算する

enter image description here

これは私の走査線のコードがそれを埋める方法です:

enter image description here

マイエッジテーブルには、これらのフィールドがあります。

et.push({ 
    Ymin: Ymin, // minimum Y of the edge 
    Ymax: Ymax, // maximum Y 
    x: Xmin, // X value of Ymin point; updated for every scanline 
    dx: Xmax - Xmin, // Delta X 
    dy: Ymax - Ymin // Delta Y 
}); 

新しいXの前夜ry scanlineは次のように計算されます。

この計算では何が問題になっていますか?

+0

「incr」とは何ですか? – usr2564301

+0

各走査線上でxに加算される増分値。私のコードはxの絶対値を計算しません。 – Michael

+2

「incr」は反対にしてはいけませんか? 'dy'ごとに' x'をインクリメントしているようですので、 'dx/dy'が必要です。そうすることで、 'dy'の行を除外する条件が成立します。つまり、ゼロで割ることを避けます。 –

答えて

3

適切なスキャンラインアルゴリズムは表示されませんが、すべてのスキャンラインをYminからYmaxまで扱いたいかのように見えます。 yYminから始まり、各走査線に対して1ずつ増加する。

したがって、各スキャンラインのxは、dx/dyだけ増加するはずです。

おそらく記号を調整する必要はありません。代わりに、dyの符号は、正または負のいずれかである:

m = dx/dy        # slope of the line 
x[y + 1] = x[y] + m * dy = x[y] + m  # dy == (y + 1) - y == 1 
x[y - 1] = x[y] + m * dy = x[y] - m  # dy == (y - 1) - y == -1 

あなたはx方向に走査し、したがってdy == 0ための水平ラインを除外します。それはあなたの数学にも表示されます:のときは、dyで割り切れません。

+0

ありがとう、これは単にこれだけでした:aet [i] .x + = aet [i] .dx/aet [i] .dy;それはよさそうだ。 – Michael

関連する問題