Làm cách nào để chuyển đổi một số từ một min \ max set sang một min \ max set khác? [đóng cửa]


19

Tôi đang tạo địa hình và tôi có một thư viện perlin cung cấp cho tôi các số ngẫu nhiên trong khoảng -1 đến +1. Tôi muốn chuyển đổi nó thành tỷ lệ 0-255. Cách thích hợp để làm điều này là gì?

Câu trả lời:


23

Công thức cơ bản là:

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

Trường hợp của bạn:

Kết quả: = (( Đầu vào - -1 ) / ( 1 - -1 ) * ( 255 - 0 ) + 0 ;

Từ đây bạn có thể tối ưu hóa chuyển đổi nếu hệ số của bạn là tĩnh, nhưng trình biên dịch có thể cũng sẽ tự làm điều đó.

Kết quả: = (( Đầu vào - -1 ) / 2 ) * 255 + 0 ;

Kết quả: = Đầu vào * 127,5 + 127,5 ;


2
Câu trả lời này có ý nghĩa nhất đối với bộ não lập trình viên của tôi. :) "Cảm ơn" mọi người vì những câu trả lời tuyệt vời của họ.
Thraka

10

Phạm vi -1đến 1là một phạm vi tổng 2. Vì vậy, bạn cần phải mở rộng nó một cách thích hợp để có được 255. Một cái gì đó như thế này:

(randomPerlin + 1.0) * 127.5

Vì vậy, trước tiên bạn thêm 1, để có được 0..2sau đó nhân với 127.5để có được một phạm vi0..255


3

Thông qua sức mạnh của quy mô và thiên vị.

Từ giá trị của bạn, trừ đi giá trị tối thiểu của phạm vi của bạn. Điều đó sẽ cung cấp cho bạn một giá trị trong phạm vi [0..2].

Chia cho chiều rộng của phạm vi nguồn, cung cấp cho bạn một giá trị trong phạm vi [0..1].

Nhân số đó với độ rộng của phạm vi mục tiêu, cung cấp cho bạn một giá trị trong phạm vi [0..255].

Thêm cơ sở của phạm vi mục tiêu để có được một giá trị trong phạm vi mục tiêu, trong trường hợp này giống như bước trước.

Tóm tắt:

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

3
oldRange = oldMax - oldMin
newRange = newMax - newMin

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

Hi vọng điêu nay co ich.


2

Dịch phạm vi đầu vào để chúng ta lấy min thành 0 bằng cách thêm 1 (giá trị âm của đầu vào min) -1 .. 1 -> 0 .. 2

Vì phạm vi đầu ra bắt đầu bằng 0, không làm gì cho điều đó.

Chia tỷ lệ phạm vi đầu vào mới để phù hợp với phạm vi đầu ra, điều này thật dễ dàng vì cả hai đều bắt đầu từ 0: nhân giá trị với 255/2 0..2 * 2/255 -> 0..255

Làm xong!

Thí dụ:

0,5 sẽ đi: (0,5 + 1) * 127,5 = 191,25 -0,5 sẽ đi: (-0,5 + 1) * 127,5 = 63,75


2

Hãy nói xlà đầu vào ban đầu và ylà đầu ra dự kiến. Chúng ta có ít nhất hai điểm (x, y) (-1, 0) (1, 255)

Vì chúng tôi muốn thực hiện một phép nội suy tuyến tính chúng ta có thể xem xét phương trình của biểu mẫu y = m*x + c

Với hai điểm trên, chúng ta có thể giải mc khi đã xong, bạn có được phương trình biến đổi.

Lưu ý phương pháp này hoạt động cho các loại phương trình khác quá. ví dụ: Nếu bạn muốn một phép nội suy theo cấp số nhân hoặc bậc hai.


Trong lĩnh vực của chúng tôi, ý nghĩa phổ biến của phép nội suy tuyến tính có xu hướng là bạn trộn tuyến tính giữa hai đại lượng với hệ số pha trộn như thế này : v = (1-a)*x + (a)*y. Tôi không thấy câu trả lời này có liên quan nhiều đến câu hỏi được hỏi vì tất cả những gì anh ta muốn là một bản đồ phạm vi.
Lars Viklund

điều là hai điểm trong một mặt phẳng xác định duy nhất một đường thẳng. chúng ta có thể coi ánh xạ phạm vi là đường thẳng. và chúng tôi biết hai điểm trên dòng đó. giải nó sẽ cho phương trình đường thẳng. có thể nội suy tuyến tính không phải là từ đúng ở đây, nhưng tôi muốn có nghĩa là tập hợp các điểm bên trong giữa hai điểm trên dòng này.
Ankush
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.