Как вывести формулу для (единицы измерения) преобразования произвольных составных единиц? - PullRequest
1 голос
/ 13 февраля 2020

Я разрабатываю приложение калькулятора , которое также позволяет конвертировать единицы . Для этого я хочу предоставить возможность не только конвертировать между произвольными (измерениями) единицами, но также и между произвольными составными единицами, такими как km/h до m/s. Во-первых, позвольте мне начать с имеющейся у меня структуры, чтобы вы понимали настройку.

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

# This is a comment.

# Unit declaration
# Name    Dimension   Aliases
meter     1           Metre, metre, m
foot      1           ft, feet
second    1           s,sec
hour      1           h

# Prefix
# Name    Alias    Base    Exponent
centi     c        10      -2
kilo      k        10      3

# Conversion
foot    30.48cm
hour    3600sec

Затем все они переносятся в типы / объекты для обработки. Поиск «прыжков» между произвольными единицами полностью реализован, это означает, что система уже может найти путь для преобразования между единицами, которым не назначено прямое преобразование. Например, я мог указать только час, равный 60 минутам, и минуту, равную 60 секундам, и система могла бы преобразовать 1 час в 3600 секунд. Это все работает. Также полностью работает поддержка префиксов.

Моя проблема начинается с преобразования единиц, которые не состоят из простого фактора, например преобразования температуры:

celsius     (x * (9/5) + 32)°F
fahrenheit  ((x - 32) * (5/9))°C

Как вы можете видеть, я уже иметь систему, которая позволяет размещать произвольные формулы для преобразования с x в качестве числа для преобразования. Теперь основной проблемой являются сложные единицы, например, когда я хочу преобразовать km/h в ft/s. Мой текущий подход заключается в следующем (предупреждение, не для слабонервных) :

  1. Разделить составной блок на его компоненты: km и h, ft и s
  2. Сопоставьте единицы друг с другом: km и ft, h and s`
  3. Получите формулу из этой точки:
    1. Конвертируйте все префиксные единицы в их базы: km в 1000m
    2. Получите коэффициент преобразования между единицами и поместите его в формулу.

Это дает ((1 * 1000) * 3.28) / (3600) как формулу деривации и примерно 0.911... коэффициент, который я затем использую для преобразования данного значения в ft/s. Пока все хорошо.

Теперь, когда мы вспомним о температурных преобразованиях, весь этот подход разваливается, потому что я использую 1 в качестве значения в формуле. Предполагая, что я хочу преобразовать C/s в F/h В настоящее время я получаю формулу (1 * (9/5) + 32) / (0.0002777) и использую полученный коэффициент для преобразования, что явно неверно.

Мой второй подход заключался в вставке значение (предположим, 9) при каждом преобразовании единицы, что дает мне (9 * (9/5) + 32) / (9 * 0.0002777), что также не является правильным решением. Я имею в виду, что случай таких температурных преобразований тоже намного сложнее. Так что с моей стороны все еще существует определенный пробел в знаниях.

Я в полном недоумении, и мне трудно найти ресурсы или решения этой проблемы. Может кто-нибудь пролить свет на то, как это сделать правильно?

1 Ответ

1 голос
/ 13 февраля 2020

Я не уверен, как именно решить вашу проблему, но вот моя идея, что не так.

В целом ваш подход работает нормально. Проблема в том, что температура, вероятно, является частным случаем. Что на самом деле будет представлять F/h или C/s? Я не думаю, что есть такое понятие в физике. Вероятно, вы подумали об изменении температуры во времени, которое будет (delta C) / h. Ваша формула для конвертации delta C в delta F будет выглядеть так: (x1 * (9/5) + 32) - (x2 * (9/5) + 32) = (x1-x2)*(9/5). Тогда вы можете использовать это в формуле для преобразования сложных единиц.

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

Я надеюсь, что это достаточно полезно и поможет вам в решении вашей проблемы.

...