Bir min \ max setinden başka bir min \ max set'e bir sayı nasıl dönüştürülür? [kapalı]


19

Arazi üretimi yapıyorum ve bana -1 ile +1 arasında rastgele sayılar veren bir perlin kütüphanem var. Bunu 0-255 ölçeğine dönüştürmek istiyorum. Bunu yapmanın uygun yolu nedir?

Yanıtlar:


23

Temel formül:

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

Senin durumun:

Sonuç: = (( giriş - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;

Buradan, katsayılarınız statikse dönüşümü optimize edebilirsiniz, ancak derleyici muhtemelen kendi başına da yapacaktır.

Sonuç: = (( Girdi - -1 ) / 2 ) * 255 + 0 ;

Sonuç: = Giriş * 127,5 + 127,5 ;


2
Bu cevap programcı beynime en mantıklı geldi. :) Harika cevapları için herkese "teşekkür ederim".
Thraka

10

Aralığı -1için 1toplam alanıdır 2. Bu yüzden ulaşmak için uygun şekilde ölçeklendirmeniz gerekir 255. Bunun gibi bir şey:

(randomPerlin + 1.0) * 127.5

Yani önce eklersiniz 1, 0..2sonra 127.5bir dizi elde etmek için ile çarpın0..255


3

Ölçeklendirme ve önyargı gücü sayesinde.

Değerinizden, aralığınızın minimum değerini çıkarın. Bu size [0..2] aralığında bir değer verecektir.

Bunu kaynak aralığı genişliğine bölün ve size [0..1] aralığında bir değer verin.

Bunu hedef aralığın genişliği ile çarpın ve size [0..255] aralığında bir değer verin.

Hedef aralıkta bir değer elde etmek için hedef aralığın tabanını ekleyin; bu durumda önceki adımla aynıdır.

Özetle:

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

3
oldRange = oldMax - oldMin
newRange = newMax - newMin

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

Bu yardımcı olur umarım.


2

1 (min girişinin negatif değeri) -1 ekleyerek min'i sıfıra indirecek şekilde giriş aralığını çevirin. -1 .. 1 -> 0 .. 2

Çıkış aralığı sıfır ile başladığında, bunun için hiçbir şey yapmayın.

Yeni giriş aralığını çıkış aralığına uyacak şekilde ölçeklendirin, artık her ikisi de sıfırdan başladığı için bu kolay: değeri 255/2 0,2 ​​* 2/255 -> 0,,255 ile çarpın

Bitti!

Misal:

0.5 gidecek: (0.5 + 1) * 127.5 = 191.25 -0.5 gidecek: (-0.5 + 1) * 127.5 = 63.75


2

Diyelim ki xorijinal girdi ve ybeklenen çıktı. En az iki noktamız var (x, y) (-1, 0) (1, 255)

Doğrusal bir enterpolasyon yapmak istediğimizden , form denklemine bakabiliriz y = m*x + c

Yukarıdaki iki nokta ile, mvec yapıldıktan sonra, dönüşüm denklemini elde edersiniz.

Bu yöntemin diğer denklem türleri için de işe yaradığını unutmayın. Örneğin, üstel veya karesel bir enterpolasyon istiyorsanız.


Alanımızda, ortak anlamı lineer interpolasyon Böyle bir harmanlama faktörü ile iki miktarları arasındaki doğrusal karıştırmak olduğunu olma eğilimindedir: v = (1-a)*x + (a)*y. Bu cevabın, tek istediği bir menzil haritalaması olduğu için sorulan soru ile ne kadar ilgili olduğunu görmüyorum.
Lars Viklund

bir düzlemdeki iki nokta, bir çizgiyi benzersiz olarak tanımlar. aralık haritalamasını düz çizgi olarak ele alabiliriz. ve bu çizgide iki nokta biliyoruz. çözme, çizgi denklemi verecektir. burada doğrusal enterpolasyon doğru kelime olmayabilir, ama ben bu çizgideki bu iki nokta arasındaki içsel noktalar kümesi demek istedim.
Ankush
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.