Bagaimana cara mengubah angka dari satu set min \ max ke set min \ max lainnya? [Tutup]

19

Saya sedang melakukan pembuatan medan dan saya memiliki perpustakaan perlin yang memberi saya angka acak antara -1 dan +1. Saya ingin mengonversikan ini ke skala 0-255. Apa cara yang tepat untuk melakukan ini?

Thraka
sumber

Jawaban:

23

Formula dasar adalah:

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

Kasus Anda:

Hasil: = (( Input - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;

Dari sini Anda dapat mengoptimalkan konversi jika koefisien Anda statis, tetapi kompiler mungkin akan melakukannya sendiri juga.

Hasil: = (( Input - -1 ) / 2 ) * 255 + 0 ;

Hasil: = Input * 127.5 + 127.5 ;

Kromster berkata mendukung Monica
sumber
2
Jawaban ini paling masuk akal bagi otak programmer saya. :) "Terima kasih" kepada semua orang untuk jawaban mereka yang luar biasa.
Thraka
10

Rentang -1ke 1adalah rentang total 2. Jadi, Anda perlu mengatur skala untuk mencapai 255. Sesuatu seperti ini:

(randomPerlin + 1.0) * 127.5

Jadi, pertama Anda menambahkan 1, untuk 0..2kemudian dikalikan dengan 127.5untuk mendapatkan rentang0..255

bummzack
sumber
3

Melalui kekuatan penskalaan dan bias.

Dari nilai Anda, kurangi nilai minimum rentang Anda. Itu akan memberi Anda nilai dalam kisaran [0..2].

Bagilah dengan lebar rentang sumber, yang memberi Anda nilai dalam kisaran [0..1].

Lipat gandakan dengan lebar rentang target, memberi Anda nilai dalam kisaran [0..255].

Tambahkan basis rentang target untuk mendapatkan nilai dalam rentang target, yang untuk kasus ini sama dengan langkah sebelumnya.

Singkatnya:

            (v - (-1.0)) 
v' = 0 + ---------------- * (255 - 0)
          (1.0 - (-1.0))
Lars Viklund
sumber
3
oldRange = oldMax - oldMin
newRange = newMax - newMin

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

Semoga ini membantu.

functionoid
sumber
2

Terjemahkan rentang input sehingga kami mendapatkan min ke nol dengan menambahkan 1 (nilai negatif dari input min) -1 .. 1 -> 0 .. 2

Ketika rentang output dimulai dengan nol, jangan lakukan apa pun untuk itu.

Skala rentang input baru sehingga sesuai dengan rentang output, ini mudah karena sekarang keduanya dimulai dari nol: kalikan nilainya dengan 255/2 0..2 * 2/255 -> 0..255

Selesai!

Contoh:

0,5 akan: (0,5 + 1) * 127,5 = 191,25 -0,5 akan:: -0,5 + 1) * 127,5 = 63,75

Valmond
sumber
2

Katakanlah xinput asli dan youtput yang diharapkan. Kami memiliki setidaknya dua poin (x, y) (-1, 0) (1, 255)

Karena kita ingin melakukan interpolasi linier, kita dapat melihat persamaan bentuk y = m*x + c

Dengan dua poin di atas, kita bisa menyelesaikan mdan c Setelah itu selesai, Anda mendapatkan persamaan transformasi.

Perhatikan metode ini juga berfungsi untuk jenis persamaan lainnya. mis. Jika Anda menginginkan interpolasi eksponensial atau kuadratik.

Ankush
sumber
Di bidang kita, makna umum dari interpolasi linear cenderung bahwa Anda mencampur linear antara dua kuantitas dengan faktor pencampuran seperti ini: v = (1-a)*x + (a)*y. Saya tidak melihat bagaimana jawaban ini memiliki banyak relevansi dengan pertanyaan yang diajukan karena yang dia inginkan hanyalah pemetaan jangkauan.
Lars Viklund
masalahnya adalah dua titik di pesawat secara unik mendefinisikan garis. kita dapat memperlakukan pemetaan rentang sebagai garis lurus. dan kita tahu dua poin di garis itu. menyelesaikannya akan memberikan persamaan garis. mungkin interpolasi linier bukan kata yang tepat di sini, tetapi saya ingin mengartikan sekumpulan titik-titik dalam di antara kedua titik pada baris ini.
Ankush