То есть вы просто после прямой линейной интерполяции, верно?
Так как у вас есть значение c
в диапазоне a..b
, и вам нужно результирующее значение в диапазоне x..y
на основе его линейного положения между a
и b
?
Уравнение для этой ситуации (при условии, что рассматриваемые числа являются числами с плавающей запятой или двойными числами):
// c is between a and b
pos = (c-a)/(b-a) // pos is between 0 and 1
result = pos * (y-x) + x // result is between x and y
Теперь, если все 0 проиндексировано, вы можете опустить a
и x
, чтобы получить
pos = c/b
result = pos * y
Если любое из чисел, с которыми вы работаете, является целочисленным типом, вам нужно привести их к двойным или плавающим числам (или к любому типу вещественных чисел) перед делением.
Вы можете объединить все уравнения вместе, если не можете привести что-либо к удвоению, хотя:
result = (c * y) / b
Это гарантирует, что c
и y
будут умножены вместе до целочисленного деления, что уменьшит ошибку, связанную с целочисленным делением.