มีสองส่วนในการสร้างเสียง fBm ที่เรียงต่อกันได้อย่างไร้รอยต่อเช่นนี้ ก่อนอื่นคุณต้องทำให้ฟังก์ชั่นเสียง Perlin เป็นแบบเรียงต่อกันได้ นี่คือบางส่วนของรหัส Python สำหรับฟังก์ชั่นลดเสียงรบกวน Perlin ที่ใช้งานได้กับทุกช่วงเวลาสูงสุด 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))
เสียงเพอร์ลินนั้นเกิดจากการรวมกันของ "surflets" เล็ก ๆ น้อย ๆ ซึ่งเป็นผลมาจากการไล่ระดับสีแบบสุ่มและฟังก์ชั่น falloff แบบแยกส่วนได้ สิ่งนี้ให้พื้นที่เป็นบวก (สีเหลือง) และพื้นที่ลบ (สีน้ำเงิน)
กระดานโต้คลื่นมีขนาดเท่า 2x2 และอยู่กึ่งกลางของจุดขัดแตะจำนวนเต็มดังนั้นค่าของเสียงเพอร์ลินในแต่ละจุดในอวกาศจึงเกิดจากการรวมกระดานโต้คลื่นที่มุมเซลล์ที่มันครอบครอง
หากคุณกำหนดทิศทางการไล่ระดับสีในบางช่วงเวลาเสียงจะดังขึ้นเองในช่วงเวลาเดียวกัน นี่คือเหตุผลที่รหัสข้างต้นใช้เวลาโมดูโลประสานงานระยะเวลาก่อนที่จะ hashing มันผ่านตารางการเปลี่ยนแปลง
ขั้นตอนอื่นคือเมื่อรวมผลอ็อกเทฟคุณจะต้องการปรับช่วงเวลาด้วยความถี่ของอ็อกเทฟ โดยพื้นฐานแล้วคุณจะต้องการให้แต่ละอ็อกเทฟแต่ละภาพเรียงภาพทั้งหมดเพียงครั้งเดียวแทนที่จะเป็นหลาย ๆ ครั้ง:
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:
หวังว่านี่จะช่วยได้!