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:
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:
- Iterasi dari 0 ke 1 pada interval tertentu
- 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:
- Saya mendapatkan koordinat x dari Beziers dan garis pada Y tertentu, menempatkannya ke dalam tabel.
- 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.
sumber
Jawaban:
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
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.
sumber