RosettaCodeData/Task/Angles-geometric-normalization-and-conversion/Delphi/angles-geometric-normalization-and-conversion.delphi
2023-07-01 13:44:08 -04:00

127 lines
2.7 KiB
Text

program normalization_and_conversion;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
System.Math;
function d2d(d: double): double;
begin
result := FMod(d, 360);
end;
function g2g(g: double): double;
begin
result := FMod(g, 400);
end;
function m2m(m: double): double;
begin
result := FMod(m, 6400);
end;
function r2r(r: double): double;
begin
result := FMod(r, 2 * Pi);
end;
function d2g(d: double): double;
begin
result := d2d(d) * 400 / 360;
end;
function d2m(d: double): double;
begin
result := d2d(d) * 6400 / 360;
end;
function d2r(d: double): double;
begin
result := d2d(d) * Pi / 180;
end;
function g2d(g: double): double;
begin
result := g2g(g) * 360 / 400;
end;
function g2m(g: double): double;
begin
result := g2g(g) * 6400 / 400;
end;
function g2r(g: double): double;
begin
result := g2g(g) * Pi / 200;
end;
function m2d(m: double): double;
begin
result := m2m(m) * 360 / 6400;
end;
function m2g(m: double): double;
begin
result := m2m(m) * 400 / 6400;
end;
function m2r(m: double): double;
begin
result := m2m(m) * Pi / 3200;
end;
function r2d(r: double): double;
begin
result := r2r(r) * 180 / Pi;
end;
function r2g(r: double): double;
begin
result := r2r(r) * 200 / Pi;
end;
function r2m(r: double): double;
begin
result := r2r(r) * 3200 / Pi;
end;
function s(f: double): string;
begin
var wf := FloatToStrF(f, ffGeneral, 16, 64).Split([FormatSettings.DecimalSeparator], TStringSplitOptions.ExcludeEmpty);
if Length(wf) = 1 then
exit(format('%7s ', [wf[0]]));
var le := length(wf[1]);
if le > 7 then
le := 7;
Result := format('%7s.%-7s', [wf[0], copy(wf[1], 0, le)]);
end;
begin
var angles: TArray<Double> := [-2, -1, 0, 1, 2, 6.2831853, 16, 57.2957795, 359,
399, 6399, 1000000];
var ft := '%s %s %s %s %s';
writeln(format(ft, [' degrees ', 'normalized degs', ' gradians ',
' mils ', ' radians']));
for var a in angles do
writeln(format(ft, [s(a), s(d2d(a)), s(d2g(a)), s(d2m(a)), s(d2r(a))]));
writeln(format(ft, [#10' gradians ', 'normalized grds', ' degrees ',
' mils ', ' radians']));
for var a in angles do
writeln(format(ft, [s(a), s(g2g(a)), s(g2d(a)), s(g2m(a)), s(g2r(a))]));
writeln(format(ft, [#10' mils ', 'normalized mils', ' degrees ',
' gradians ', ' radians']));
for var a in angles do
writeln(format(ft, [s(a), s(m2m(a)), s(m2d(a)), s(m2g(a)), s(m2r(a))]));
writeln(format(ft, [#10' radians ', 'normalized rads', ' degrees ',
' gradians ', ' mils ']));
for var a in angles do
writeln(format(ft, [s(a), s(r2r(a)), s(r2d(a)), s(r2g(a)), s(r2m(a))]));
readln;
end.