डायमंड स्क्वायर एल्गोरिदम एक फ्रैक्टल टेरेन (ऊंचाई) है जो एल्गोरिथ्म उत्पन्न करता है। आप एक अच्छा विवरण पा सकते हैं कि यह यहाँ कैसे काम करता है:
http://www.gameprogrammer.com/fractal.html (संदर्भ के रूप में प्रयुक्त)
http://www.playfuljs.com/realistic-terrain-in-130-lines/ (ग्रेट जेएस कार्यान्वयन, शायद आप उसके रेंडरर को चुराना चाहें। यहां एक नज़र डालें कि यह एल्गोरिथ्म http: // डेमो के लिए क्या सक्षम है । playfuljs.com/terrain/ ।)
सामान्य विचार यह है कि आपके पास बीज (ए) के रूप में 4 कोने हैं, और उन चार कोनों को औसतन और -0.5 और 0.5 (बी) के बीच यादृच्छिक मान जोड़कर केंद्र बिंदु की ऊंचाई की गणना करें। यदि आप इसे ग्रिड पर लागू करते हैं तो आपको फिर से हीरों का एक ग्रिड मिलता है (चौकों 45 ° तक फ़िर जाता है) और आप उसी (सी, डी) को दोहराते हैं, लेकिन यादृच्छिक सीमा छोटी हो जाती है, जैसे -0.125 से 0.125 आदि।
आपके प्रोग्राम को कई इनपुट्स स्वीकार करने होंगे:
- एक पूर्णांक
l=1,2,3,...
जो वर्ग ग्रिड के आकार को लंबाई के साथ निर्धारित करता है2^l+1
। इसमेंl=10
आपको लगभग एक मिलियन नंबर स्टोर करने होंगे। - प्रत्येक कोने के लिए चार बीज (फ्लोटिंग पॉइंट)
- एक पैरामीटर
0<h<1
जो खुरदरापन (H
लिंक में) निर्धारित करता है इसका मतलब है कि शुरू में कितनी बड़ी यादृच्छिक रेंज है - पैरामीटर्स
a,b
जो यादृच्छिक श्रेणी के लिए प्रारंभिक निचले और ऊपरी सीमा का प्रतिनिधित्व करते हैं औरh
प्रत्येक शोधन चरण में गुणा करते हैं। (यादृच्छिक संख्या समान रूप सेa
और के बीच चुनी जाती हैb
।
आउटपुट में 2d ग्रिड समाप्त होना चाहिए।
तो किसी न किसी एल्गोरिथ्म इस तरह दिखेगा:
Create a square grid with sidelength 2^l+1
Place seed values in the corners
Repeat:
| Perform square steps
| Refine Range: a = a*h; b=b*h;
| Perform diamond steps
| Refine Range
एक विवरण है जिसके बारे में आपको पता होना चाहिए: ग्रिड की सीमा पर, आपके पास केवल हीरे के तीन कोने होंगे , इसलिए आपको केवल उन तीन बिंदुओं के औसत की भी गणना करनी चाहिए।
कुछ उदाहरणों का एक दृश्य
इस एल्गोरिथ्म का एक मामूली परिवर्तनशील कार्यान्वयन यहां पाया जा सकता है: समानांतर अनुमानित voxel इलाके जनरेटर
मैंने ग्रेस्केल छवि के रूप में 2 डी में विस्थापित ऊँचाई के लिए जावास्क्रिप्ट में एक छोटा सा ड्राइंग फ़ंक्शन बनाया। http://jsfiddle.net/flawr/oy9kxpsx/
यदि आप में से कोई भी फैंसी 3 डी में है और 3 डी में नक्शे देखने के लिए एक स्क्रिप्ट बना सकता है तो मुझे बताएं! =