इस तरह सीमलेस टिलिबल एफबीएम शोर बनाने के दो भाग हैं। सबसे पहले, आपको पेरलिन शोर फ़ंक्शन को खुद को बनाने योग्य बनाने की आवश्यकता है। यहाँ एक सरल पेर्लिन शोर फ़ंक्शन के लिए कुछ पायथन कोड है जो किसी भी अवधि के साथ 256 तक काम करता है (आप पहले सेक्शन को संशोधित करके इसे जितना चाहें उतना बढ़ा सकते हैं):
import random
import math
from PIL import Image
perm = range(256)
random.shuffle(perm)
perm += perm
dirs = [(math.cos(a * 2.0 * math.pi / 256),
math.sin(a * 2.0 * math.pi / 256))
for a in range(256)]
def noise(x, y, per):
def surflet(gridX, gridY):
distX, distY = abs(x-gridX), abs(y-gridY)
polyX = 1 - 6*distX**5 + 15*distX**4 - 10*distX**3
polyY = 1 - 6*distY**5 + 15*distY**4 - 10*distY**3
hashed = perm[perm[int(gridX)%per] + int(gridY)%per]
grad = (x-gridX)*dirs[hashed][0] + (y-gridY)*dirs[hashed][1]
return polyX * polyY * grad
intX, intY = int(x), int(y)
return (surflet(intX+0, intY+0) + surflet(intX+1, intY+0) +
surflet(intX+0, intY+1) + surflet(intX+1, intY+1))
पेर्लिन का शोर थोड़ा "सरफलेट्स" के योग से उत्पन्न होता है जो एक यादृच्छिक रूप से उन्मुख ग्रेडिएंट और एक अलग पॉलीओनोमियल फ़ॉलऑफ़ फ़ंक्शन का उत्पाद होता है। यह एक सकारात्मक क्षेत्र (पीला) और नकारात्मक क्षेत्र (नीला) देता है
सर्फ़लेट्स में 2x2 की सीमा होती है और पूर्णांक जाली बिंदुओं पर केंद्रित होती है, इसलिए अंतरिक्ष में प्रत्येक बिंदु पर पेर्लिन शोर का मान सेल के कोनों पर सर्फ़लेट्स को समेट कर उत्पन्न होता है, जिस पर वह रहता है।
यदि आप कुछ अवधि के साथ ढाल दिशाओं को लपेटते हैं, तो शोर स्वयं उसी अवधि के साथ मूल रूप से लपेटेगा। यही कारण है कि ऊपर दिए गए कोड को क्रमांकन तालिका के माध्यम से हैशिंग से पहले जाली समन्वित मोड्यूलो की अवधि लेता है।
दूसरा कदम, यह है कि जब ओक्टेव को समेटना है तो आप ऑक्टेव की आवृत्ति के साथ अवधि को स्केल करना चाहेंगे। अनिवार्य रूप से, आप चाहते हैं कि प्रत्येक सप्तक पूरी छवि को एक बार टाइल करे, बजाय कई बार:
def fBm(x, y, per, octs):
val = 0
for o in range(octs):
val += 0.5**o * noise(x*2**o, y*2**o, per*2**o)
return val
एक साथ रखो और तुम कुछ इस तरह से मिलता है:
size, freq, octs, data = 128, 1/32.0, 5, []
for y in range(size):
for x in range(size):
data.append(fBm(x*freq, y*freq, int(size*freq), octs))
im = Image.new("L", (size, size))
im.putdata(data, 128, 128)
im.save("noise.png")
जैसा कि आप देख सकते हैं, यह वास्तव में निर्बाध रूप से टाइल करता है:
कुछ छोटे ट्विकिंग और कलर मैपिंग के साथ, यहां क्लाउड इमेज को 2x2 से टाइल किया गया है:
उम्मीद है की यह मदद करेगा!