ベジェ曲線と直線で構成される形状をどのように塗りつぶす必要がありますか?


8

私はしばらくの間グラフィックライブラリに取り組んでおり、ベジエフォントとラインベースのフォントを描画しなければならないところまで到達しました。この時点まで、私はこれで立ち往生しています:

私

a

緑の線はベジェパスで、白い部分がレンダリングされます。

ベジエに使用するコードはこちらです。ライン用はこちら。知らない人はルアです。

パスレンダリング(ライン):32-39アルゴリズムは次のとおりです。

  1. 特定の間隔で0から1まで繰り返す
  2. 次の式でxとyを計算します。 (1-index)^2*x1+2*(1-index)*index*x2+index^2*x3

この時点まで、すべてが正常に動作します。緑の線は、パスメソッドを使用して生成されます。

白い部分は完全に異なる方法でレンダリングされます:

  1. 特定のYでのベジエと線のx座標を取得し、それらをテーブルに入れます。
  2. テーブルを繰り返し処理し、ポイントに遭遇するたびに状態の値を変更します。同じforループで、状態がオンかどうかも確認します。もしそうなら、私は画面にピクセルを描画します。

ayのx値を見つけるには、getXメソッドを使用します(ベジェでは46行目、ラインでは31行目)。

図面自体に使用するコードは次のコードです。

local xBuffer = {}
local state = false

for i=0,500 do
    for k,v in pairs(beziers) do
        a,b = v.getX(i)
        if a then
            xBuffer[round(a)] = 1
            if b then
                xBuffer[round(a)] = 1
            end
        end
    end
    for k,v in pairs(lines) do
        a = v.getX(i)
        if a then
            xBuffer[round(a)] = 1
        end
    end
    state = false
    for x=0,600 do
        if xBuffer[x] then
            state = not state
        end
        if state then
            love.graphics.points(x,i)
        end
    end
end

簡単な説明:i、vはペアで、ペアの引数として指定されたテーブルを反復処理します。love.graphics.points(x、y)は、x、yにポイントを設定します。

前もって感謝します。


誰も応答しない理由はありますか?質問を再定式化する必要がありますか?
作成者

1
初期の頃は、回答する時間のある人が非常に多く、これまでのところ5つのビューしかありません。このstackexchangeはまだ幼児であり、多くのユーザーが時間を割くことはありません。
joojaa

OK。ありがとう。あまり人がいないことに気づきませんでした。
作成者

回答:


6

お急ぎの場合にあなたのレンダラは、作業を取得し、あなたはすでに満たされた多角形のルーチンが持って正常に機能し、私が代わり、おそらくより簡単なアプローチを提案することができますか?私はLuaに精通していませんが、2次ベジエとのスキャンラインの正確な交差を解決しているようです。

代わりに、ベジェをラインセグメントにテッセレーションし、それをポリゴンスキャンコンバーターにスローします。(再帰的な)バイナリサブディビジョンを使用することをお勧めします。つまり、制御点を持つ2次ベジエ、¯B¯C¯ 2つのベジェに分割でき、 ¯D¯E¯ そして E¯F¯C¯ どこ

D¯=¯+B¯2E¯=¯+2B¯+C¯4F¯=B¯+C¯2
(固定小数点演算しかない場合にも便利です)。

IIRC、細分割するたびに、ベジェとエンドポイントを結ぶ直線セグメントの間の誤差は約4倍に減少するため、区分的線形近似が真と区別できないようになるまで、細分割をあまり必要としません。曲線。また、コントロールポイントのバウンディングボックスを使用して、サブディビジョンプロセスを早期にスキップできるかどうかを決定することもできます。これは、カーブの控えめな境界になるためです。


1
ありがとう!A、B、Cはベクトルで正しいですか?また、必要な正確なポイント数を取得できるスキャンラインメソッドを使用しています。コードを見て、なぜ機能しないのか推測できますか?ちょうど式。また、私は回答に賛成票を投じますが、15の評判はありません。
作成者

はい、AB&Cはベクトルです。あなたのケースでは2Dですが、N次元にも同様に適用されます。コードの処理については...私が言ったようにLuaがわからず、標準のポリゴンスキャンラインレンダラーを正しく取得することさえ難しい場合があります。これをベジエを直接処理するように拡張すると(20年以上前に行ったように)、それはさらに困難になります。時間がないのでごめんなさい。
Simon F

1
助けてくれてありがとう。問題が見つかりました。二次方程式のaとcが反転しました。
作成者
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.