Математический алгоритм / функция для преобразования этого числа в 40? - PullRequest
1 голос
/ 24 июня 2010

Я программирую ручку со стрелкой, положение которой определяется по номеру дуги.

Я ищу способ преобразовать это число дуги в число, которое будет представлять температуру.

Минимальное число дуги будет 1,3, а максимальное - 1,7.

1,3 должно равняться 40, а 1,7 - 99.

Возможно ли это?

Ответы [ 6 ]

7 голосов
/ 24 июня 2010

Если он линейный, вы можете использовать следующую формулу, чтобы учесть любой минимум и максимум:

from_min = -1.3
from_max = 1.7
to_min = 40
to_max = 99
from = <whatever value you want to convert>
to = (from - from_min) * (to_max - to_min) / (from_max - from_min) + to_min

Бит * (to_max - to_min) / (from_max - from_min) масштабирует диапазон от диапазона from до диапазона to. Вычитая from_min до и добавляя to_min после, найдите правильную точку в диапазоне to.

Примеры, сначала оригинал:

(1.3..1.7) -> (40..99)
to = (from - from_min) * (to_max - to_min) / (from_max - from_min) + to_min
   = (from - 1.3)      * 59                / 0.4                   + 40
   = (from - 1.3) * 147.5 + 40 (same as Ignacio)
   = from * 147.5 - 151.75     (same as Zebediah using expansion)

Затем тот, который использует -1,3 в качестве нижней границы, как упомянуто в одном из ваших комментариев:

(-1.3..1.7) -> (40..99)
to = (from - from_min) * (to_max - to_min) / (from_max - from_min) + to_min
   = (from - -1.3)      * 59                / 3                    + 40
   = (from + 1.3) * 19.67 + 40

Этот ответ (и все остальные на сегодняшний день, конечно) предполагает, что он является линейной функцией. Это ни в коем случае не ясно, если использовать в вопросе такие слова, как «дуга» и «ручка». Вам может понадобиться некоторая тригонометрия (синусы, косинусы и т. Д.), Если окажется, что линейного недостаточно.

4 голосов
/ 24 июня 2010

(n - 1.3) * 147.5 + 40

3 голосов
/ 24 июня 2010

Конечно, просто подведите к нему строку.

В этом случае output = 147.5*input-151.75

1 голос
/ 24 июня 2010

Поскольку я упустил простое решение, вот еще один способ думать об этом:

let delta(q) denote the rate of change of some quantity q.

Тогда ваши связанные ставки

delta(output)/delta(input) = (99 - 40) / (1.7 - 1.3) = 59/0.4 = 147.5

* Таким образом, 1007 *

delta(output) = 147.5 * delta(input). 

Предполагая, что эта функция является непрерывной (то есть вы можете выполнить произвольные крошечные регулировки ручки, а не отдельные щелчки), мы можем объединить обе стороны, давая:

output = 147.5 * input + some_constant

Поскольку мы знаем, что когда вход равен 1,3, то выход равен 40, мы имеем

40 = 147.5 * (1.3) + some_constant

Таким образом

some_constant = 40 - 147.5 * 1.3 = -151.75

Следовательно, вы хотите уравнение

output = 147.5 * input - 151.75
1 голос
/ 24 июня 2010

Это действительно простая задача алгебры, линейная алгебра не нужна.

def scale_knob( knob_input ):

  knob_low = -1.3
  knob_high = 1.7
  knob_range = knob_high - knob_low   # 1.7 - -1.3 = 3.0.

  out_low = 40.0
  out_high = 99.0
  out_range = out_high - out_low      # 99.0 - 40.0 = 59.0

  return ( knob_input - knob_low ) * ( out_range / knob_range ) + out_low
  # scaled = ( input - (-1.3) ) * ( 59 / 3.0 ) + 40.0
1 голос
/ 24 июня 2010

Простое небольшое шоу линейной алгебры здесь.

Две переменные - это положение ручки (x) и некоторая постоянная (p).

тогда оба уравнения равны

1.3x + p = 40
1.7x + p = 99

Решение первого уравнения для p с точки зрения x дает:

p = 40 - 1.3x

Если мы добавим это новое определение p во второе уравнение, мы можем упростить до:

1.7x + 40 - 1.3x = 99
.4x = 59
x = 147.5

Тогда вы можете решить для p из любого уравнения. Используя первое уравнение:

p = 40 -1.3*147.5 = -151.75

Таким образом, ваше окончательное уравнение для получения температуры из положения ручки должно быть

temp = 147.5*knobPosition - 151.75
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...