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?

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 ;


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


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))

3
oldRange = oldMax - oldMin
newRange = newMax - newMin

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

Semoga ini membantu.


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


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.