ฉันกำลังสร้างภูมิประเทศและฉันมีห้องสมุด perlin ที่ให้ตัวเลขสุ่มระหว่าง -1 ถึง +1 ฉันต้องการแปลงเป็นสเกลของ 0-255 วิธีที่เหมาะสมในการทำเช่นนี้คืออะไร?
ฉันกำลังสร้างภูมิประเทศและฉันมีห้องสมุด perlin ที่ให้ตัวเลขสุ่มระหว่าง -1 ถึง +1 ฉันต้องการแปลงเป็นสเกลของ 0-255 วิธีที่เหมาะสมในการทำเช่นนี้คืออะไร?
คำตอบ:
สูตรพื้นฐานคือ:
Result := ((Input - InputLow) / (InputHigh - InputLow))
* (OutputHigh - OutputLow) + OutputLow;
กรณีของคุณ:
ผลลัพธ์: = (( อินพุต - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;
จากที่นี่คุณสามารถเพิ่มประสิทธิภาพการแปลงหากค่าสัมประสิทธิ์ของคุณเป็นแบบคงที่ แต่คอมไพเลอร์อาจทำด้วยตัวเองเช่นกัน
ผลลัพธ์: = (( อินพุต - -1 ) / 2 ) * 255 + 0 ;
ผลลัพธ์: = อินพุต * 127.5 + 127.5 ;
ช่วงที่-1
ไปเป็นช่วงที่รวมของ1
ดังนั้นคุณจำเป็นต้องปรับให้เหมาะสมที่จะได้รับ2
255
บางสิ่งเช่นนี้
(randomPerlin + 1.0) * 127.5
ดังนั้นคุณจึงเพิ่มเป็นครั้งแรก1
ที่จะได้รับไป0..2
แล้วคูณด้วย127.5
ที่จะได้รับช่วงของ0..255
ผ่านพลังแห่งการปรับขนาดและอคติ
จากค่าของคุณให้ลบค่าต่ำสุดของช่วงของคุณ มันจะให้ค่าในช่วง [0..2]
หารด้วยความกว้างของช่วงต้นทางให้ค่าในช่วง [0..1]
คูณด้วยความกว้างของช่วงเป้าหมายให้ค่าในช่วง [0..255]
เพิ่มฐานของช่วงเป้าหมายเพื่อรับค่าในช่วงเป้าหมายซึ่งในกรณีนี้เหมือนกับขั้นตอนก่อนหน้า
สรุป:
(v - (-1.0))
v' = 0 + ---------------- * (255 - 0)
(1.0 - (-1.0))
oldRange = oldMax - oldMin
newRange = newMax - newMin
newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin
หวังว่านี่จะช่วยได้
แปลช่วงข้อมูลเข้าเพื่อให้เราได้รับนาทีถึงศูนย์โดยการเพิ่ม 1 (ค่าลบของการป้อนข้อมูลขั้นต่ำ) -1 .. 1 -> 0 .. 2
เมื่อช่วงเอาต์พุตเริ่มต้นด้วยศูนย์ให้ทำสิ่งใดเพื่อสิ่งนั้น
ปรับขนาดช่วงอินพุตใหม่เพื่อให้เหมาะกับช่วงเอาต์พุตนี่เป็นเรื่องง่ายเพราะทั้งคู่เริ่มต้นที่ศูนย์: คูณค่า 255/2 0..2 * 2/255 -> 0..255
ทำ!
ตัวอย่าง:
0.5 จะไป: (0.5 + 1) * 127.5 = 191.25 -0.5 จะไป: (-0.5 + 1) * 127.5 = 63.75
ให้บอกว่าx
เป็นอินพุตดั้งเดิมและy
เอาต์พุตที่คาดหวัง เรามีอย่างน้อยสองจุด
(x, y) (-1, 0) (1, 255)
เนื่องจากเราต้องการทำการประมาณเชิงเส้นเราจึงสามารถดูสมการของแบบฟอร์มได้
y = m*x + c
ด้วยจุดสองจุดด้านบนเราสามารถแก้หาm
และc
เมื่อเสร็จแล้วคุณจะได้สมการการแปลง
หมายเหตุวิธีนี้ใช้ได้กับสมการประเภทอื่นด้วย เช่นหากคุณต้องการการแก้ไขแบบเอ็กซ์โพเนนเชียลหรือกำลังสอง
v = (1-a)*x + (a)*y
มีแนวโน้มที่จะเป็นไปได้ว่าคุณผสมเส้นตรงระหว่างสองปริมาณกับปัจจัยการผสมเช่นนี้ ฉันไม่เห็นว่าคำตอบนี้มีความเกี่ยวข้องกับคำถามที่ถามมากเพียงใดเนื่องจากสิ่งที่เขาต้องการคือการทำแผนที่แบบช่วง