วิธีการแปลงจำนวนจากหนึ่ง min \ max ถูกตั้งค่าเป็น min \ max อีกชุด? [ปิด]


19

ฉันกำลังสร้างภูมิประเทศและฉันมีห้องสมุด perlin ที่ให้ตัวเลขสุ่มระหว่าง -1 ถึง +1 ฉันต้องการแปลงเป็นสเกลของ 0-255 วิธีที่เหมาะสมในการทำเช่นนี้คืออะไร?

คำตอบ:


23

สูตรพื้นฐานคือ:

Result := ((Input - InputLow) / (InputHigh - InputLow))
          * (OutputHigh - OutputLow) + OutputLow;

กรณีของคุณ:

ผลลัพธ์: = (( อินพุต - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;

จากที่นี่คุณสามารถเพิ่มประสิทธิภาพการแปลงหากค่าสัมประสิทธิ์ของคุณเป็นแบบคงที่ แต่คอมไพเลอร์อาจทำด้วยตัวเองเช่นกัน

ผลลัพธ์: = (( อินพุต - -1 ) / 2 ) * 255 + 0 ;

ผลลัพธ์: = อินพุต * 127.5 + 127.5 ;


2
คำตอบนี้เหมาะสมที่สุดสำหรับสมองโปรแกรมเมอร์ของฉัน :) A "ขอบคุณ" สำหรับทุกคนสำหรับคำตอบที่ยอดเยี่ยมของพวกเขา
Thraka

10

ช่วงที่-1ไปเป็นช่วงที่รวมของ1 ดังนั้นคุณจำเป็นต้องปรับให้เหมาะสมที่จะได้รับ2 255บางสิ่งเช่นนี้

(randomPerlin + 1.0) * 127.5

ดังนั้นคุณจึงเพิ่มเป็นครั้งแรก1ที่จะได้รับไป0..2แล้วคูณด้วย127.5ที่จะได้รับช่วงของ0..255


3

ผ่านพลังแห่งการปรับขนาดและอคติ

จากค่าของคุณให้ลบค่าต่ำสุดของช่วงของคุณ มันจะให้ค่าในช่วง [0..2]

หารด้วยความกว้างของช่วงต้นทางให้ค่าในช่วง [0..1]

คูณด้วยความกว้างของช่วงเป้าหมายให้ค่าในช่วง [0..255]

เพิ่มฐานของช่วงเป้าหมายเพื่อรับค่าในช่วงเป้าหมายซึ่งในกรณีนี้เหมือนกับขั้นตอนก่อนหน้า

สรุป:

            (v - (-1.0)) 
v' = 0 + ---------------- * (255 - 0)
          (1.0 - (-1.0))

3
oldRange = oldMax - oldMin
newRange = newMax - newMin

newValue = ((oldValue - oldMin) * newRange / oldRange) + newMin

หวังว่านี่จะช่วยได้


2

แปลช่วงข้อมูลเข้าเพื่อให้เราได้รับนาทีถึงศูนย์โดยการเพิ่ม 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


2

ให้บอกว่าxเป็นอินพุตดั้งเดิมและyเอาต์พุตที่คาดหวัง เรามีอย่างน้อยสองจุด (x, y) (-1, 0) (1, 255)

เนื่องจากเราต้องการทำการประมาณเชิงเส้นเราจึงสามารถดูสมการของแบบฟอร์มได้ y = m*x + c

ด้วยจุดสองจุดด้านบนเราสามารถแก้หาmและc เมื่อเสร็จแล้วคุณจะได้สมการการแปลง

หมายเหตุวิธีนี้ใช้ได้กับสมการประเภทอื่นด้วย เช่นหากคุณต้องการการแก้ไขแบบเอ็กซ์โพเนนเชียลหรือกำลังสอง


ในสาขาของเรามีความหมายทั่วไปของการสอดแทรกเชิงเส้นv = (1-a)*x + (a)*yมีแนวโน้มที่จะเป็นไปได้ว่าคุณผสมเส้นตรงระหว่างสองปริมาณกับปัจจัยการผสมเช่นนี้ ฉันไม่เห็นว่าคำตอบนี้มีความเกี่ยวข้องกับคำถามที่ถามมากเพียงใดเนื่องจากสิ่งที่เขาต้องการคือการทำแผนที่แบบช่วง
Lars Viklund

สิ่งนั้นคือสองจุดในระนาบที่กำหนดเส้นอย่างไม่ซ้ำกัน เราสามารถรักษาการทำแผนที่ช่วงเป็นเส้นตรง และเรารู้จุดสองจุดบนเส้นนั้น การแก้มันจะให้สมการเส้นตรง อาจเป็นการแก้ไขเชิงเส้นไม่ใช่คำที่ถูกต้องที่นี่ แต่ฉันต้องการหมายถึงชุดของจุดภายในระหว่างจุดสองจุดบนเส้นนี้
Ankush
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.