Bagaimana menghindari persimpangan saat menerapkan stroke ke kurva?

11

Saya memiliki beberapa objek Spline2D dalam kode saya, yang masing-masing memiliki metode Posisi, Kecepatan, dan Akselerasi yang mengembalikan vektor dari kuantitas yang ditentukan pada waktu tertentu. Saya telah menggunakan vektor-vektor ini untuk membangun geometri untuk membuat goresan gradien untuk kurva, tapi saya mengalami masalah dengan persimpangan-diri pada kurva yang curam. Sebagai contoh, inilah satu kurva di mana saya mengalami hal ini:

Wireframe: http://twitpic.com/2zplw1/full
Diisi: http://twitpic.com/2zpmnt/full

Seperti yang Anda lihat, pada tikungan kedua, bagian dalam berpotongan dengan sendirinya, yang menyebabkan artefak jelek itu. Apakah ada algoritma / metode yang baik untuk kurva belokan tanpa menyebabkan persimpangan-sendiri?

Sunting : Contoh yang lebih ekstrem, ditambah mock-up dari apa yang ingin saya capai:

Wireframe: http://twitpic.com/2ztwzi/full
Diisi: http://twitpic.com/2ztwkt/full
Hasil Ideal (Mock-Up): http://twitpic.com/2ztxa8/full

ThatsGobbles
sumber
Wow, saya bahkan belum menyadari konotasi judul ketika saya menulisnya. :)
ThatsGobbles

Jawaban:

3

Jika Anda merendernya dengan GPU dan api 3D modern apa pun (mis. OpenGL / D3D), bagi saya sepertinya Anda dapat menyingkirkan ini dengan pengujian mendalam. Jika Anda menetapkan verts luar Anda menjadi z = FAR, dan verts dalam Anda menjadi z = DEKAT, pengujian mendalam harus mencegah tumpang tindih dari ditampilkan. Dengan OpenGL:


  // don't forget to clear depth buffer to 1.0f at beginning of frame.
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // enable depth testing.
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);

// draw the Spline2D for each segment in spline for each vert in segment if (vert is an outer vert), set vert.z = 1.0, otherwise set vert.z=0.0

Caveat emptor: ini tidak akan berfungsi jika Anda membutuhkan goresan tembus cahaya.

jpaver
sumber
1
Jawaban yang bagus, hanya apa yang saya pikirkan, namun, Anda salah tentang hal itu tidak bekerja untuk stroke transparan jika Anda mengizinkan menulis zbuffer dalam satu pass, kemudian melakukan warna di yang kedua.
Richard Fabian
Terima kasih, pukulan saya memang buram, jadi ini bekerja sangat sederhana dan luar biasa!
ThatsGobbles
1

"Perbaikan" akan tergantung pada apa yang Anda inginkan terlihat seperti hasilnya. Masalahnya belum didefinisikan dengan cukup baik di sini: seperti apa bentuknya?

Saya sarankan Anda pertama kali mencoba membuat contoh kesalahan yang lebih ekstrem, kemudian menggunakan photoshop / cat untuk memperbaikinya Anda mungkin menemukan inspirasi untuk solusi.

Apakah Anda ingin melipat? Tumpang tindih dengan ujungnya? Tarik sampai tidak tumpang tindih?

Richard Fabian
sumber
Poin baiknya, saya akan membuat kurva yang lebih tajam, dan kurva "ideal" di Illustrator atau Inkscape hari ini.
ThatsGobbles
Pos asli diedit!
ThatsGobbles