Skip to content

Instantly share code, notes, and snippets.

@kdzwinel
Created January 3, 2014 09:35
Show Gist options
  • Save kdzwinel/8235348 to your computer and use it in GitHub Desktop.
Save kdzwinel/8235348 to your computer and use it in GitHub Desktop.
Simple trilateration algorithm implementation in JavaScript.
function getTrilateration(position1, position2, position3) {
var xa = position1.x;
var ya = position1.y;
var xb = position2.x;
var yb = position2.y;
var xc = position3.x;
var yc = position3.y;
var ra = position1.distance;
var rb = position2.distance;
var rc = position3.distance;
var S = (Math.pow(xc, 2.) - Math.pow(xb, 2.) + Math.pow(yc, 2.) - Math.pow(yb, 2.) + Math.pow(rb, 2.) - Math.pow(rc, 2.)) / 2.0;
var T = (Math.pow(xa, 2.) - Math.pow(xb, 2.) + Math.pow(ya, 2.) - Math.pow(yb, 2.) + Math.pow(rb, 2.) - Math.pow(ra, 2.)) / 2.0;
var y = ((T * (xb - xc)) - (S * (xb - xa))) / (((ya - yb) * (xb - xc)) - ((yc - yb) * (xb - xa)));
var x = ((y * (ya - yb)) - T) / (xb - xa);
return {
x: x,
y: y
};
}
@Athanasius
Copy link

The issue is that the code assumes that the 'a' and 'b' points don't have the same 'x' co-ordinate. It's the var x = line ending in '/ (xb - xa)'. They need to be different to avoid a divide by zero. Swap your 2nd and 3rd points and it'll work.

@pherris
Copy link

pherris commented Jan 19, 2015

Here is a link back to the author's youtube video with the use case: https://www.youtube.com/watch?v=dMWEl6GBGqk

@gheja
Copy link

gheja commented Jun 30, 2015

Just posted another trilateration, based on the Wikipedia derivation. I believe it is easier to follow it, also it is working in 3D space and returns [ 39.996, 99.996, +/-0.53 ] for your example input, @ravisharma1987 (can be configured to return the middle, then it returns [ 39.996, 99.996, 0 ]).
https://github.com/gheja/trilateration.js

@ThisIsDjonathan
Copy link

Hey guys!

I did an example using p5js.org

Thanks @kdzwinel for the help with the math!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment