Как говорил
Лекс Айрин: через коэффициенты.
Вот пример перевода угловых координат. Если единицы
inp_units и
out_units переводятся, то выдается коэффициент пересчета, если нет, то (-1).
Естественно данные описываются структурой: величина, размерность.
В примере 6 единиц: радианы, футы, метры, угловые секунды, угловые градусы, угловая величина DMS.
Матрица коэффициентов factors. На примере перевода в радианы:
(1, 0, 0, 180/PI*3600, 180/PI, 0): радиан в радианы =1; в футы и метры не переводится = 0; в секунды = 180/PI*3600; градусы = 180/PI; в DMS =0 не переводится.
- Код: Выделить всё
// get the conversion factor for converting between the input and output units
// I: input/output units codes: RADIAN=0, FEET=1, METER=2, SECOND=3, DEGREE=4, DMS=5
// O: -1 for incorrect, else conversion_factor
function get_unit_conversion_factor(inp_units,out_units: byte): real;
const
//Таблица пересчета: 0 - единицы не конвертируются друг в друга
// 0: Rad = (1, 0, 0, 180/PI*3600, 180/PI, 0)
factors: array[0..5,0..5] of real =
( (1.0, 0.0, 0.0, 206264.8062470963, 57.295779513082323, 0.0),
(0.0, 1.0, 0.3048006096012192, 0.0, 0.0, 1.000002000004),
(0.0, 3.280833333333333, 1.0, 0.0, 0.0, 3.280839895013124),
(0.484813681109536e-5, 0.0, 0.0, 1.0, 0.27777777777778e-3, 0.0),
(0.01745329251994329, 0.0, 0.0, 3600, 1.0, 0.0),
(0.0, 0.999998, 0.3048, 0.0, 0.0, 1.0) );
begin
if (inp_units<=5) and (out_units<=5) then
Result:=factors[inp_units,out_units]
else Result:=-1;
// Angle units can not be converted to length units
if Result=0 then Result:=-1;
end;