Bir eğriye kontur uygularken kendi kendine kesişme nasıl önlenir?


11

Kodumda, her biri belirli bir zamanda belirtilen miktarda bir vektör döndüren bir Konum, Hız ve İvme yöntemine sahip birkaç Spline2D nesnesi var. Bu vektörleri eğriler için gradyan konturları oluşturmak üzere geometri oluşturmak amacıyla kullanıyorum, ancak dik eğrilerde kendiliğinden kesişme sorunları yaşıyorum. Örnek olarak, ben burada bu meydana gelen bir eğri:

Tel kafes: http://twitpic.com/2zplw1/full
Dolgulu: http://twitpic.com/2zpmnt/full

Gördüğünüz gibi, ikinci virajda, iç kısım kendisiyle kesişiyor, bu da bu çirkin esere neden oluyor. Kendi kendine kesişmeye neden olmadan eğrileri atmak için iyi bir algoritma / yöntem var mı?

DÜZENLEME : Daha uç örnekler, ayrıca elde etmek istediğim şeylerin bir maketi:

Tel kafes: http://twitpic.com/2ztwzi/full
Doldurulmuş: http://twitpic.com/2ztwkt/full
İdeal Sonuç (Maket): http://twitpic.com/2ztxa8/full


Vay canına, yazdığımda başlığın çağrışımını bile fark etmemiştim. :)
ThatsGobbles

Yanıtlar:


3

Bunları GPU ve herhangi bir modern 3D api (örneğin OpenGL / D3D) ile oluşturuyorsanız, derinlik testi ile bundan kurtulabileceğiniz gibi görünüyor. Dış verts'inizi z = FAR ve iç verts'inizi z = NEAR olarak atarsanız, derinlik testi çakışmanın görünmesini engellemelidir. OpenGL ile:


  // 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

Uyarı emptor: yarı saydam vuruşlara ihtiyacınız varsa bu işe yaramaz.


1
Harika bir cevap, sadece düşündüğüm şey, ancak zbuffer'ı bir geçişte yazmanıza ve daha sonra ikincisinde renk yapmanıza izin verirseniz yarı saydam konturlar için çalışmama konusunda yanılıyorsunuz.
Richard Fabian

Teşekkürler, vuruşlarım gerçekten opak, bu yüzden bu çok basit ve harika çalıştı!
ThatsGobbles

1

"Düzeltme", elde edilen çıktının nasıl görünmesini istediğinize bağlı olacaktır. Sorun gerçekten yeterince iyi tanımlanmadı: neye benziyor?

İlk önce aksaklıktan çok daha aşırı bir örnek oluşturmayı denemenizi, ardından düzeltmek için photoshop / paint'i kullanmanızı öneririm, bir çözüm için ilham bulabilirsiniz.

Katlanmasını ister misiniz? Kenar ile çakışıyor mu? Çakışmayana kadar içeri çekin?


İyi bir nokta, daha keskin bir eğri ve bugünkü Illustrator veya Inkscape'te "ideal" bir eğri oluşturacağım.
ThatsGobbles

Orijinal yayın düzenlendi!
ThatsGobbles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.