Bagaimana cara memetakan angka, secara linier, antara a dan b untuk berpindah antara c dan d.
Artinya, saya ingin angka antara 2 dan 6 dipetakan ke angka antara 10 dan 20 ... tetapi saya memerlukan kasus umum.
Otak saya digoreng.
Bagaimana cara memetakan angka, secara linier, antara a dan b untuk berpindah antara c dan d.
Artinya, saya ingin angka antara 2 dan 6 dipetakan ke angka antara 10 dan 20 ... tetapi saya memerlukan kasus umum.
Otak saya digoreng.
Jawaban:
Jika bilangan X Anda berada di antara A dan B, dan Anda ingin Y berada di antara C dan D, Anda dapat menerapkan transformasi linier berikut:
Itu akan memberi Anda apa yang Anda inginkan, meskipun pertanyaan Anda agak ambigu, karena Anda juga bisa memetakan interval ke arah sebaliknya. Hati-hati terhadap pembagian dengan nol dan Anda akan baik-baik saja.
sumber
Y=f(X)=m*X+b
, di mana m dan b telah ditentukan secara bersamaan dari dua persamaan kendala berikut yang dihasilkan dari penggantian nilai X dan Y pada titik akhir yang diperlukan:C=m*A+b
danD=m*B+b
X=A+(A-B)*t
untuk membuktikan kesetaraan antara pendekatan ini dan Peter. t pada dasarnya adalah nondimensionalization dari X. (t=(X-A)/(A-B)
)Bagilah untuk mendapatkan rasio antara ukuran kedua rentang, lalu kurangi nilai awal rentang awal Anda, kalikan dengan rasio dan tambahkan nilai awal rentang kedua Anda. Dengan kata lain,
Ini menyebarkan angka secara merata dari kisaran pertama di kisaran kedua.
sumber
Akan menyenangkan memiliki fungsi ini di
java.lang.Math
kelas, karena ini adalah fungsi yang sangat dibutuhkan dan tersedia dalam bahasa lain. Berikut ini implementasi sederhana:Saya meletakkan kode ini di sini sebagai referensi untuk diri saya di masa depan dan mungkin itu akan membantu seseorang.
sumber
Selain itu, ini adalah masalah yang sama dengan klasik mengubah celcius ke farenheit di mana Anda ingin memetakan rentang angka yang menyamakan 0 - 100 (C) menjadi 32 - 212 (F).
sumber
Setiap interval satuan pada kisaran pertama membutuhkan (dc) / (ba) "spasi" pada kisaran kedua.
Semu:
Bagaimana Anda menangani pembulatan itu terserah Anda.
sumber
Tentu saja dengan memeriksa bagi dengan nol.
sumber
jika rentang Anda dari [a hingga b] dan Anda ingin memetakannya di [c ke d] di mana x adalah nilai yang ingin Anda petakan, gunakan rumus ini (pemetaan linier)
sumber
https://rosettacode.org/wiki/Map_range
sumber
Selain jawaban @PeterAllenWebb, jika Anda ingin membalikkan kembali hasilnya, gunakan yang berikut:
sumber