Câu trả lời:
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 ;
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))
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
Hãy nói x
là đầu vào ban đầu và y
là đầ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 m
và c
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.
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.