İnşaat mühendisliği birikimim var ve düzenli olarak hidrolik ve hidrolojik analizler yapıyorum. Bu tür şeyler için derece satıyorlar, ama bu gerçekten roket bilimi değil. Son zamanlarda GPU'da bir arazi için tüm hidrolojik ve hidrolik süreci uygulamak aklıma geldi. Son zamanlarda hesaplama gölgelendiricileri öğrendim, bu yüzden şu anda mühendislikte paralel GPU iş akışları tasarlamaktan daha iyi durumda kaldım.
Bir yağış olayı sırasında üretilen su miktarını aşağıdaki formülü kullanarak hesaplayabilirsiniz:
Q (CF/S) = c * I (in/hr) * A (acres)
Ben bile ilk alanın "dönüm" hesaplamak ötesinde hareket zorlanıyorum.
Mevcut uygulamaya genel bakış:
- Arazi, 1 birim aralıklarla düzenli bir köşe noktası ızgarasıdır
- Bir yükseklik haritası, her köşe için bir R32 yükseklik değeri içerir
- Şu anda, sadece 4 kardinal yönde akışa izin veriyorum (köşegenler yok)
- Daha önce analiz ettiğim köşeler için şablon olarak bir Texture2D [int] kullanıyorum
Mevcut algoritma:
- Arazi aracı aktif olduğunda ve şimdi değilken ...
- "Şablonu" temizleyin.
- En düşük rakım için tüm araziyi tarayın.
- Bu tek nokta CS_Flood'a ilk girdi.
- CS_Flood bir X ekseni geçişi yapar.
- Her bir giriş tepe noktası, 2048 kereye kadar hem X- hem de X + yönlerinde yansıtılır.
- OOB koordinatıyla bitişik bir tepe noktası bulmak, arazinin kenarını bu yönde gösterir. CurrentPoint, BoundaryPoints arabelleğine eklenir ve bu yönde projeksiyon döngüsü sona erdirilir. Bu kolaydı ve her seferinde harika çalışıyor.
- Yükseklikleri> olan bitişik köşeler = = geçerli tepe noktasının yüksekliği şablonda işaretlenir ve NextPass arabelleğine eklenir.
- Yükseklikleri olan bitişik köşeler <geçerli tepe noktasının yüksekliği bir sırtın zirvesini gösterir ve projeksiyon döngüsünü sonlandırır. Sel dolgu bir gelecek yineleme olabilir bunun "geri" tarafı yukarı sırtın tabanını etrafında akış ve aynı sırtta ikinci kez algılar.
- Defadan fazla algılanır Herhangi zirve / mahya noktaları olacak değil bu amaçla, bir BoundaryPoint ol.
- Tam olarak bir kez tespit edilen pik / tepe noktaları BoundaryPoints'e eklenir ve bu yönde projeksiyon döngüsü sona erdirilir.
- CS_Flood, X ekseni geçişi tarafından üretilen noktaları giriş olarak kullanarak aynı kodla bir Z ekseni geçişi yapar.
- Şu anda, CS_Flood iki yön arasında süresiz olarak değişmeye devam ediyor. Sonunda, CS_Flood tamamlandığında ve NextPass arabelleği boş olduğunda genel döngüyü sonlandıracağım.
İdeal olarak, bu noktada, BoundaryPoints doğal drenaj bölünmesinde meydana gelen her bir tepe noktasını içerecektir. Sınır içine inen su damlaları sonunda aynı düşük noktaya akar. Sınırın dışına inen su damlaları "başka bir yere" gider.
Sonra:
- Şablonu temizlemeden araziyi en düşük, şablonsuz köşe için yeniden tarayın.
- CS_Flood'u yineleyin.
- Şablon dolana kadar (veya benzer bir şey) tekrarlayın.
3D'nin bu renklerle algılanması zordur; bu, integral yüksekliklerde kontur çizgilerini gösterir:
(kenara yakın bir berm ile çevrili bir delik)
Bir tepe noktasında süzülmenin yaklaşık 10 benzersiz yolu vardır; her birine benzersiz bir renk vermek gibi
görünür : (görünür dairesel takım işaretleri, "sırtlar" güzel görünür)
Bu, sınır veya başka bir şekilde CS_Flood tarafından oluşturulan her noktayı POINTLIST olarak gösterir:
Algoritma her zaman neredeyse çalışır . Bazen, düzgün çalışıyor bile. Diğer zamanlarda, algoritma açıkça doğru şekle dahil edilir, ancak noktaları süresiz olarak çıkarmaya devam eder. 3. ekran görüntüsünde görüldüğü gibi, bazen kafası karışır. Göz ardı ettiğim başka bir durum / faktör olmalı. Gözetimimi veya soruna saldırmak için daha basit ve / veya daha zarif yollarla ilgili önerileri bulma konusunda herhangi bir yardımı takdir ediyorum.
MissingPoint! NextPass arabelleğine algılanan her yeni BoundaryPoint'i eklemek için algoritmaya bant yardımı ile eklenebilir. Bir sonraki geçişte, bu yara bandı tarafından üretilen puanların% 99'u, hiçbir yere gidemediklerini ve hiçbir şey yapamayacaklarını belirleyerek az miktarda GPU harcayacaktır. İlk geçiş sırasında, diğer NextPass noktalarıyla birlikte LowPoint göndermek de bu özel senaryoyu işleyecektir.
Bunun mantıklı olduğunu biliyorum ve yeterli zaman verildiğinde, istediğimi yapacak kadar bando yardımı yapabilirim. Mümkünse daha iyi, daha akıllı, daha hızlı bir şekilde yapmak istiyorum ve daha iyi bilmek için henüz yeterli tecrübem yok.