मैं डायमंड स्क्वायर के साथ कुछ काम के बाद पेरलिन शोर के साथ कर रहा हूँ। मैंने ह्यूगो एलियास द्वारा कार्यान्वयन का पालन किया जो मूल रूप से प्रत्येक समन्वय मूल्य को फेंकने के लिए इनपुट के रूप में एक्स, वाई के साथ कार्यों की एक श्रृंखला बनाता है।
मेरा PHP कोड यहाँ है :
मेरे दो सवाल हैं:
किसी सरणी में ऊंचाई का नक्शा बनाने के लिए मैं एल्गोरिथ्म का उपयोग कैसे करूं? मैं इसे पूरी तरह से समझ नहीं पाया और सिर्फ pseudocode को PHP में पोर्ट कर गया, लेकिन कहीं पढ़ने के बाद आखिरी फ़ंक्शन (map_perilt) कर रहा था कि एल्गोरिथ्म "जादुई रूप से" आपको प्रत्येक x के लिए ट्रांस्फ़ॉर्म किए गए मान देता है, y पॉइंट दिया गया (जाहिरा तौर पर, इसके पढ़ने के बिना। आसन्न मूल्य), मुझे बस यादृच्छिक फ़ंक्शन के रूप में उपयोग करते समय यह मिलता हैmt_rand(-100,100)/100;
और यह क्रिप्टोग्राफिक का उपयोग करते समय: 1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;
(जो, BTW, PHP में "as-is"?) लागू किया जा सकता है।
इसलिए, तीन प्रश्नों का सारांश दें:
- क्या मेरा कोड सही है?
- यादृच्छिक फ़ंक्शन को PHP में पोर्ट किया जा सकता है जैसा कि कोड में वर्णित है? यह कोई त्रुटि नहीं फेंकता है, लेकिन परिणाम नहीं हैं।
- मैं वास्तव में एल्गोरिथ्म का उपयोग कैसे करूं?
अद्यतन करें
ठीक है, Gustavson पेपर में दिखाए गए कोड का एक PHP पोर्ट बनाया गया है, और जैसा कि अन्य कोडर ने कहा है, यह सिर्फ एक ऑक्टेव उत्पन्न करता है। शोर समारोह को नियंत्रित करने के लिए कई अष्टक, आयाम, आवृत्ति आदि की अवधारणाओं के साथ इसका उपयोग करने के बारे में कोई अन्य उपयोगी साइट / पेपर / गाइड है? गुस्तावसन के कागज पर सिर्फ परिणाम दिखाई देते हैं, न कि एल्गोरिथम का वास्तविक कार्यान्वयन, शायद मुझे कुछ याद आ रहा है?
अद्यतन 2
@ नोट
मैंने कुछ इस तरह बनाया:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
for ($o = 0; $o < 8; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += SimplexNoise($i*$frequency, $j * $frequency) * $amplitude;
}
//$value = SimplexNoise($i, $j) + 0.5 * SimplexNoise($i, $j) + 0.25 * SimplexNoise($i, $j);
$this->mapArray[$i][$j] = new Cell($value);
और मानों को सामान्य करने के बाद 0..1 करने के लिए, मुझे एक बहुत ही कम ऊंचाई का नक्शा मिलता है जैसे:
मैं नक्शे को कैसे बीज सकता हूं? शायद जो मुझे लागू करने की आवश्यकता है वह तीसरे संस्करण के साथ 3 डी संस्करण है एक यादृच्छिक ऊंचाई? लेकिन अगर ऐसा है, तो मुझे पड़ोसी मूल्यों को ध्यान में रखना होगा, जो कि मैं एक डायमंड स्क्वायर एल्गोरिदम जैसी चीज के साथ समाप्त करूंगा, बिल्कुल वही जो मैं नहीं करना चाहता।
अद्यतन 3
अधिक पेर्लिन काम करते हैं। मुझे अभी तक अपने परिणामों के लिए शोर को निर्देशित करने का एक तरीका नहीं मिला है। इन सप्तक और अंतिम परिणाम देखें:
सप्तक I से IV तक
सारांश पेश करना
प्रत्येक सप्तक बहुत अधिक समान है। कोड की जाँच करें:
$persistence = 0.5;
for ($j = 0; $j < $size; $j++) {
for ($i = 0; $i < $size; $i++) {
$value = 0;
for ($o = 0; $o < 4; $o++) {
$frequency = pow(2,$o);
$amplitude = pow($persistence, $o);
$value += improved_noise($i*$frequency, $j*$frequency, 0.5)*$amplitude;
}
$this->map[$i][$j] = new Cell($value);
परिणाम सामान्यीकृत हैं। शोर के विकास में आप क्या प्रभाव डालेंगे? मैं ऐसे उदाहरण देखता हूं जहां आयाम बदलने से नरम या खुरदरी सतह मिलती है, लेकिन अगर मैं एक विशाल आयाम देता हूं, तो भी मुझे थोड़ा अंतर दिखाई देता है।