6

Parametrik bir yüzey f : R^2 --> R^3 ve üçgen şeklinde bir ağ arasındaki kesişme yüzeyinin sınırını hesaplamak için kesin bir algoritmanın nasıl yazılabileceğini merak ediyorum.Parametrik yüzeyli bir ağın kesişimi

Ben ilk yaklaşıma düşünmüşümdür:

nStepsU = 100 
nStepsV = 100 
tolerance=0.01 // pick some sensical value 
intersectionVertices={} 
for u from minU to maxU in nStepsU: 
    for v from minV to maxV in nStepsV: 
     for v in verticesInMesh: 
      if euclidean distance(f(u,v), v) < tolerance: 
       add vertex v in a set 

connect the vertices in intersectionVertices with a line strip 
draw the vertices in intersectionVertices 

, Bu algoritma (n^3) çok basit ama yavaş ve meş topografya üçgenler dayandığını hesapta tutmaz böylece Çıktı noktaları, kafesin noktalarıdır ve yüzeylerin üçgenler ile kesişiminden yararlanarak hesaplanan noktalar değildir ve birisinin ayarlaması gereken toleransa büyük ölçüde bağımlıdır.

Birisi daha iyi bir fikriniz varsa veya bu amaç için beni uygun bir kütüphaneye yönlendirebilir mi?

+1

Yüzey ile ilgili ek bilgileriniz var mı? Verimli çalışabilir misin? Hangi noktada bir noktaya etkili bir şekilde ulaşabiliyor musunuz? – maxim1000

+0

Yüzey bir helikoiddir. X (r, teta) = r * cos (teta), 'y (r, teta) = teta, z (r, teta) = r * sin (teta)' dır Bir iç ve dış bir ayırt etmek imkansız – linello

+0

Oh, sağ. Bu yüzden cevabım tam olarak açık değil. Ama yine de theta ve r'yi (x, y, z) olarak belirleyebilir ve bundan işaretli bir mesafe hesaplayabilirsiniz. Bununla ilgili net olmayan şey, bunun ne kadar kesin olmasını bekliyorsunuz? Bir üçgen y-doğrultusunda yüzeyde birden çok kez kesişirse ne olur? –

cevap

3

Her üçgenin üzerinde yinelemek ve üçgenin kesişimini yüzeyle hesaplamak istiyorum. Üçgenleri giriş olarak alan ve çizgi şeritleri çıkaran bir geometri gölgelendiricisi kullanırdım. Üçgendeki her köşe için, işaretli mesafeyi yüzeye hesaplayın. Daha sonra kenarların üzerinde yineleme yapın: h'un farklı işaretlere sahip olduğu iki köşe varsa, bu köşeler arasındaki kenar yüzeyle kesişir. Ben tam kesişme hesaplanabilir emin olduğum sürece, en kolay çözüm doğru parçasının bir köşesinin her kavşak, doğrusal enterpolasyon yani

vec3 intersection = (h0 * v1 + h1 * v0)/(h0 + h1); 

Sonra çıkış olacaktır.

here gönderdiğim kod başlatılabilir. Sadece sonucu çizmek istiyorsanız, muhtemelen bu soruda tarif ettiğim aynı problemle karşılaşacaksınız. İstemcideki köşelere ihtiyacınız varsa, transform feedback'u kullanabilirsiniz.

Düzenleme: Sadece biraz test yaptım. Orada dışarıda/hayır içindedir ve bu mesafe fonksiyonu işareti küçük pozitif veya küçük negatiften giderse sadece köşeleri yayabilir, 90 ° -90 ° gider yana mesafe fonksiyonu olarak ben

float distToHelicoid(in vec3 p) 
{ 
    float theta = p.y/5 + offset.x/50; 
    float a = mod(theta - atan(p.z, p.x), 2*PI) - PI; // [-PI, PI[ 
    if (abs(a) > PI/2) 
    a = mod(theta - atan(-p.z, -p.x), 2*PI) - PI; 
    return a; 
} 

kullanılan bunun tersi, 90 ° ila -90 ° arasında döndürüldüğünde değil.

enter image description here

temiz yolu en yakın devrim indeksini belirlemek olacaktır: Burada ben sadece 45 ° abs (dist)> mesafeleri filtre. Örneğin. [-pi, pi] devrim 0 olur, [pi, 3pi] = devrim 1, vs. Sadece iki mesafenin aynı devrime atıfta bulunmasını istersiniz. senin yüzey daima helikoit ise

+0

Yaklaşımınızı beğendim, burada tek şey, geometri gölgelendiricilerini daha iyi incelemem gerektiğidir. Ayrıca, yakınlık durumunun kırmızı olarak kabul edildiği köşe noktasını renklendiren özel bir köşe gölgelendirici kullanmak için karmaşıklığı azaltmak için düşündüm. Üçgenleri geometri gölgelendiricilere nasıl yükleyeceğinizi belgeleyen iyi bir bağlantınız var mı? – linello

+0

Bir geometri gölgelendiricisi girişini köşe gölgelendiricisinden alır, böylece normalde yaptığınızdan farklı bir şey yapmanız gerekmez. Normal vertex + fragman shader programınızın yerine, bir geometri gölgelendiricisi de eklersiniz. Sonra programı her zamanki gibi kullanın ve geometrinizi çizin. Yani aslında entegrasyon çok kolay. Boru hattına nasıl uyduğunu öğrenmek için [burada] (http://www.opengl.org/wiki/Geometry_Shader) adresine bakın. –

+0

@linello Helicoid için bir mesafe fonksiyonu ekledim. –

1

, size bir spiral alacak

helikoidinin yüzeyi o silindirin yüzeyine dik hatları oluşur

ve projeksiyon sonra eksen Y etrafında bir silindir üzerine her şeyi yansıtmak için deneyebilirsiniz . Bu üçgenin üzerine üç boyutlu üçgen kafesin izdüşümünden sonra 2B üçgen kafes elde edeceksiniz (bazı alanların birkaç üçgen katmanla kaplanmış olabileceğini unutmayın). Böylece görev daha basit olan spiralin kesiştiği 2B üçgen ağında üçgenler bulmaya başlar. Yaklaşımlar için uygunsa, spirali kesebilir ve spiralin kesiştiği üçgenleri bulmak için bir çeşit ağaç kullanabilirsiniz.

Spiralin bir kısmını kesişen bir üçgenin olduğu bir kesişme noktasında, bir kesiti bir bölüm olacak, parçanın 3B koordinatlarını yeniden hesaplayabilir ve bu bölümlerin kümesi kesişme çizginizdir.

İlgili konular