2009-08-03 28 views
5

Ben herhangi bir gerçek çözüm olmadan son birkaç gün boyunca render yolun üzerine şaşırtıcı oldum.Bir takım veri noktaları verilen düzgün bir yol nasıl oluşturulur?

Yol oluşturma ile, veri kümesi noktaları arasında düzenli aralıklarla kesikli bir çizgi (veya benim durumum döndürülmüş dörtlü olarak) çizmek için bir dizi x, y veri noktası (değişken aralıkta) verildiğini kastediyorum. pürüzsüz bir yol oluşturmak.

seni bu özel oyunda render yola benzer bir etki oluşturmak için çalışıyorum iPhone için uçuş kontrolü var.

İşte benim sorunum. Eğer grafik + aralığının genişliği 2 veri kümesi noktaları arasındaki mesafeye tam olarak uygun değilse, o zaman üst üste bindirme veya üst üste bindiriyorum. Bu Benim tek çözüm ya

1) sonraki veri seti noktasının bitiş noktası ve sonra aşağıdaki noktaya oradan çekmek için örtüşme/alt bindirme noktaya atın olduğunu.

2) Her zaman nihai bitiş noktasının altında çizip sonraki veri noktasından bir taze bir başlangıç.

Ne bu çözümlerin

idealdir ve her iki sorunlar var.

Daha iyi bir çözümü olan var mı?

Herhangi bir yardım çok takdir edilecektir. http://www.firemint.com/flightcontrol/screenshots-peaceful.html

kalın noktalı çizgi:

aşağıdaki ekran

Ben oluşturmaya çalışıyorum göstermektedir.

güncelle:

Merhaba, I (4 kontrol noktası ile) bir kübik eğrisi hesaplanır eğrileri ile işleme çalıştı. Ancak sorun enterpolasyon biridir. 0 ve 1 verildiğinde 2 noktadan geçebilirim. Ancak tüm yol boyunca adım atmak istiyorum (çoklu kontrol noktaları). Sorun şu ki, bazı kontrol noktaları birbirinden ayrı bir mesafe olacak ve böylece sabit bir adım artışından (0,2) geçerek düzensiz sonuçlar üretecektir. Bütün yol boyunca doğru bir şekilde adım atmak için tüm eğrinin uzunluğunu hesaplamak zorunda olduğumu anlıyorum ... soru şu nasıl yaparım? ... Ya da başka bir yol var mı?

Alkış Zengin

+0

Bu konuda bir çözüm buldunuz mu? –

cevap

0

tamamen sabit boyutlu dörtlü sınırlı Are ? İdeal çözüm son dörtgenin doğru boyuta kesilmesidir.

kısıtlı iseniz, birkaç şey yapabilirdi. Kesik çizgiler çiziyorsanız uç noktalarda kısmi dörtlü ile hiç bitmeyeceğinizden emin olmak için tire mesafelerini değiştirebilirsiniz. Bu, mesafenin bölümün uzunluğuna göre ayarlanacağı için görsel olarak dikkat dağıtıcı olabilir.

düzenleme:

Resim, yardımcı olur. Bu, iPhone'da olduğundan, aralarındaki çizim çizgilerinin kabul edilebilir bir eğri oluşturduğu bir dizi nokta aldığınızı düşünüyorum. Eğer spline/eğri ilkellerini kullanan durum buysa, muhtemelen fazladır. Muhtemelen çizim çizgilerine, son veri noktasından belirli bir mesafe olan her veri noktasında dörtlü çizerek gösterildiği gibi yaklaşırdım.

algoritma olurdu gibi bir şey: Son noktadan az X mesafede oluncaya kadar

  1. nokta listede Traverse ilk veri noktasında quad (uygun şekilde döndürülmüş)
  2. çizin
  3. Bir sonraki dördünü yerleştirmek için tam merkez bulmak için mevcut nokta ve son ziyaret edilen nokta arasındaki Lerp.
  4. son dörtlü için kısmi noktası varsa (bu, onu kesmek daha iyi bir görsel verecektir) Normal olarak çizmeyi 2
  5. adıma (uygun şekilde döndürülmüş) quad
  6. Git çizin.

eğlence için, iki nokta arasındaki mesafeden daha az olan bir mesafe D İki nokta arasındaki LERP (bu muhtemelen 2B durumda daha basit ama genellikle çalışmak ister) için:

vector v = point2 - point1; 
normalize(v); 
v *= D; 
finalPoint = point1 + v; 
+0

Sadece geçerli olandan belirli bir uzaklık olan veri noktalarını kabul ediyorum, bu yüzden puanların harmanlanması minimum mesafeye sahip olacak. Hangi benim rotasyonlu grafik ile aynı mesafedir. Ancak kullanıcı parmaklarını hızlı bir şekilde hareket ettirirse, noktalar arasındaki mesafe artar (dolayısıyla enterpolasyon). Lerping parçasını biraz daha detaylandırabilir misiniz, çünkü şu anda yaptığım şeye benziyor ve bu ekran görüntüsünde olduğu gibi düzgün bir yol oluşturmuyor. – Rich

+0

Açıkladığım yöntem, yalnızca çizgiler arasındaki mesafenin 2 katından daha uzak olmayan veri noktalarınız varsa iyi görünüyor. Eğer veri puanlarınız bundan daha uzaksa, eğriniz uyuşmaya başlayacağından eğri uydurma yöntemini (bu gibi bir problem için standart eğri uydurma Catmull-rom olma eğilimindedir) araştırmanız gerekir. –

+0

İnterpolasyona ilişkin olarak, veri noktanız genellikle dörtlüyü çizmek istediğiniz yerin tam üstünde olmayacağından, veri noktalarınızın ikisi arasında bir yere gitmeniz gerekir. Hangi ikisini arasında olmak istediğinizi biliyorsanız, doğrusal bir enterpolasyon uygulayabilirsiniz (dörtlü çizginin ne kadar uzağa gitmesi gerektiğine bağlı olarak bazı interpolasyon sabiti için iki nokta arasındaki çizginin denklemini çözün) veya daha uzaksa, Bir eğri yaklaşımı enterpolasyonu uygulayın (yukarıda belirttiğim gibi). –

3

Düzgün yollar çizmek için kullanılan "CGPathAddQuadCurveToPoint" adlı bir CoreGraphics işlevi var. An example on how to use it is on GitHub.

+0

Teşekkürler, eve döndüğümde bir şey vereceğim. Söylesene, Açık GLES'te yapılabilecek bir şey var mı? Bir çok CoreGraphics'in bildiği gibi Open GLES'de işe yaramıyor. – Rich

+0

@Rich, OpenGL ile bütünleştirilebilecek herhangi bir CoreGraphics malzemesinin OpenGL ile entegre edilebileceği ölçüde aynı olabilir. Konuyla ilgili tecrübem yok. =) –

+0

Açık bir gl yüzeyinin üzerinde temel grafik öğeleri oluşturabileceğinizi düşünmemiştim ??? – Rich

İlgili konular