Bagaimana saya harus mengisi bentuk yang terdiri dari kurva Bezier dan garis lurus?

8

Saya telah bekerja di perpustakaan grafis untuk beberapa waktu sekarang dan telah sampai pada titik di mana saya harus menggambar Bezier dan font berbasis garis. Sampai titik ini saya terjebak dengan ini:

saya

Sebuah

Garis hijau adalah jalur Bezier, dan bagian putih adalah apa yang diberikan.

Kode yang saya gunakan untuk Beziers ada di sini . Satu untuk baris ada di sini . Bagi mereka yang tidak tahu itu adalah Lua.

Path rendering (lines): 32 - 39 Algoritme adalah sebagai berikut:

  1. Iterasi dari 0 ke 1 pada interval tertentu
  2. menghitung x dan y dengan rumus ini: (1-index)^2*x1+2*(1-index)*index*x2+index^2*x3

Hingga saat ini semuanya bekerja dengan baik. Garis hijau dihasilkan menggunakan metode jalur.

Bagian putih diterjemahkan dengan cara yang sama sekali berbeda:

  1. Saya mendapatkan koordinat x dari Beziers dan garis pada Y tertentu, menempatkannya ke dalam tabel.
  2. Saya beralih melalui tabel dan setiap kali saya menemukan titik saya mengubah nilai negara. Di dalam yang sama untuk loop juga memeriksa apakah keadaan aktif. Jika ya, saya menggambar pixel ke layar.

Untuk menemukan nilai x dari ay, saya menggunakan metode getX (baris 46 di Bezier dan baris 31 di Line).

Kode yang saya gunakan untuk menggambar itu sendiri adalah ini:

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

Penjelasan cepat: untuk i, v berpasangan beralih melalui tabel yang diberikan sebagai argumen untuk berpasangan. love.graphics.points (x, y) menetapkan titik pada x, y.

Terima kasih sebelumnya.

Pencipta
sumber
Apakah ada alasan tidak ada yang merespons? Haruskah saya merumuskan kembali pertanyaan?
Pencipta
1
Hari-hari awal hanya ada begitu banyak orang yang punya waktu untuk menjawab dan sejauh ini Anda baru mencapai 5 tampilan. Pertukaran stack ini masih bayi dan belum banyak pengguna memberikan waktu.
joojaa
BAIK. Terima kasih. Saya tidak menyadari begitu sedikit orang di sini.
Pencipta

Jawaban:

6

Jika Anda terburu-buru untuk membuat renderer Anda bekerja dan Anda sudah memiliki rutinitas poligon yang diisi berfungsi dengan benar , dapatkah saya menyarankan alternatif, mungkin pendekatan yang lebih mudah? Meskipun saya tidak akrab dengan Lua, tampaknya Anda sedang menyelesaikan untuk persimpangan garis scan dengan Bezier kuadrat yang, meskipun mengagumkan, mungkin berlebihan.

Sebagai gantinya, tessellate Beziers Anda ke dalam segmen garis dan kemudian lemparkan ke dalam konverter pemindai poligon. Saya sarankan hanya menggunakan subdivisi biner (rekursif): yaitu Bezier kuadratik dengan titik kontrol,(A¯,B¯,C¯) dapat dibagi menjadi dua Beziers, (A¯,D¯,E¯) dan (E¯,F¯,C¯) dimana

D¯=A¯+B¯2E¯=A¯+2B¯+C¯4F¯=B¯+C¯2
(Yang juga bagus jika Anda hanya memiliki matematika titik tetap).

IIRC, setiap kali Anda membagi, kesalahan antara Bezier dan hanya segmen garis lurus yang bergabung dengan titik akhir turun dengan faktor ~ 4x, sehingga tidak membutuhkan banyak subdivisi sebelum pendekatan linier sesegera mungkin tidak dapat dibedakan dari yang sebenarnya melengkung. Anda juga dapat menggunakan kotak pembatas dari titik kontrol untuk memutuskan apakah Anda dapat melewati proses pembagian lebih awal karena itu juga akan menjadi ikatan konservatif pada kurva.

Simon F
sumber
1
Terima kasih! A, B, C apakah vektor benar? Juga, saya menggunakan metode scanline karena memungkinkan saya untuk mendapatkan jumlah poin tepat yang saya butuhkan. Bisakah Anda melihat kode dan menebak mengapa itu tidak berfungsi? Hanya formulanya. Saya juga akan meningkatkan tanggapan, tetapi saya tidak memiliki reputasi.
Pencipta
Ya, AB & C adalah vektor; 2D dalam kasus Anda tetapi ini berlaku juga untuk dimensi N. Adapun untuk pergi melalui kode ... seperti yang saya katakan saya tidak tahu Lua dan bahkan mendapatkan renderer scanline poligon standar yang benar bisa rumit - misalnya Anda harus sangat berhati-hati ketika menghitung persimpangan yang terletak tepat pada posisi titik. Ketika Anda memperluas ke penanganan Beziers secara langsung (yang saya lakukan sekitar 20+ tahun yang lalu) itu masih lebih sulit. Maaf saya tidak punya waktu.
Simon F
1
Terima kasih untuk bantuannya. Baru saja menemukan masalahnya. A dan c dalam persamaan kuadrat terbalik.
Pencipta