Home > Software design >  JavaScript Math functions outputs different float numbers
JavaScript Math functions outputs different float numbers

Time:11-02

I'm trying to do trigonometry in JavaScript. When I try run this code in the terminal:

function angle(deg, min, sec) { return (deg)   (min / 60)   (sec / 3600); }

let deg2 = 89, min2 = 45, sec2 = 0, dist2 = 11.27;
let lat2 = (Math.sin(angle(deg2, min2, sec2))) * dist2;
let long2 = (Math.cos(angle(deg2, min2, sec2))) * dist2;
console.log("lat2 , long2 : "   lat2   "  ,  "   long2);

I get this:

lat2 , long2 : 11.011462356910855  ,  -2.400124322266507

instead of this:

lat2 , long2 : 11.269892717722677  ,  0.049174495639093

I tried swapping the cos and sin with each other but no luck. Also tried to replace cos with tan and still different result. Also replaced sin with tan and still not correct.

CodePudding user response:

You should break your problem into smaller chunks.

Create functions for converting:

  • Sexagesimal degrees (DMS) to decimal degrees
  • Decimal degrees to radians
  • Radians and distance to coordinates (latitude and longitude)

Note: Functions that end with a "2" are "overloaded methods" that take an object instead of a list of parameters. This is for purely for convenience.

const
  toDecimalDegrees = (degrees, minutes, seconds) =>
    degrees   (minutes / 60)   (seconds / 3600),
  toDecimalDegrees2 = ({ degrees, minutes, seconds }) =>
    toDecimalDegrees(degrees, minutes, seconds),
  toRadians = (degrees) =>
    degrees * (Math.PI / 180),
  toCoordinates = (degrees, minutes, seconds, distance = 0) =>
    (angle => ({
      latitude: Math.sin(angle) * distance,
      longitude: Math.cos(angle) * distance
    }))
    (toRadians(toDecimalDegrees(degrees, minutes, seconds))),
  toCoordinates2 = ({ degrees, minutes, seconds }, distance) =>
    toCoordinates(degrees, minutes, seconds, distance);

const
  angle       = { degrees: 89, minutes: 45, seconds: 0 },
  distance    = 11.27,
  coordinates = toCoordinates2(angle, distance);

console.log(coordinates);

CodePudding user response:

Trigonometry functions expects the angle in radians not degrees. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sin https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cos

function angle(deg, min, sec) {
    return (deg)   (min / 60)   (sec / 3600);
}

let deg2 = 89,
    min2 = 45,
    sec2 = 0,
    dist2 = 11.27;
let lat2 = Math.sin(Math.PI * angle(deg2, min2, sec2) / 180) * dist2;
let long2 = Math.cos(Math.PI * angle(deg2, min2, sec2) / 180) * dist2;

console.log("lat2 , long2 : "   lat2   "  ,  "   long2);

  • Related