Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public Node trilateration(List<Circle> circles, boolean return_middle){
- Node p1 = circles.get(0).center;
- Node p2 = circles.get(1).center;
- Node p3 = circles.get(2).center;
- Node ex = vector_divide(vector_subtract(p2, p1), norm(vector_subtract(p2, p1)));
- double i = dot(ex, vector_subtract(p3, p1));
- Node a = vector_subtract(vector_subtract(p3, p1), vector_multiply(ex, i));
- Node ey = vector_divide(a, norm(a));
- Node ez = vector_cross(ex, ey);
- double d = norm(vector_subtract(p2, p1));
- double j = dot(ey, vector_subtract(p3, p1));
- double x = (sqr(circles.get(0).radius) - sqr(circles.get(1).radius) + sqr(d)) / (2 * d);
- double y = (sqr(circles.get(0).radius) - sqr(circles.get(2).radius) + sqr(i) + sqr(j)) / (2 * j) - (i / j) * x;
- double z = Math.sqrt(sqr(circles.get(0).radius) - sqr(x) - sqr(y));
- if(Double.isNaN(z)){
- return null;
- }
- a = vector_add(p1, vector_add(vector_multiply(ex, x), vector_multiply(ey, y)));
- Node p4a = vector_add(a, vector_multiply(ez, z));
- Node p4b = vector_subtract(a, vector_multiply(ez, z));
- if (z == 0 || return_middle) {
- return a;
- } else {
- // return [p4a, p4b];
- return null;
- }
- }
- public double distance(double x1, double y1, double z1, double x2, double y2, double z2){ //Evklidovo rastojanie
- return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
- }
- public double sqr(double a) {
- return a * a;
- }
- public double norm(Node a) {
- return Math.sqrt(sqr(a.X) + sqr(a.Y) + sqr(a.Z));
- }
- public double dot(Node a, Node b) {
- return a.X * b.X + a.Y * b.Y + a.Z * b.Z;
- }
- public Node vector_subtract(Node a, Node b) {
- Node node = new Node(a.X-b.X, a.Y-b.Y, a.Z-b.Z, false);
- return node;
- }
- public Node vector_add(Node a, Node b) {
- Node node = new Node(a.X+b.X, a.Y+b.Y, a.Z+b.Z, false);
- return node;
- }
- public Node vector_divide(Node a, double b) {
- Node node = new Node(a.X/b, a.Y/b, a.Z/b,false);
- return node;
- }
- public Node vector_multiply(Node a, double b) {
- Node node = new Node(a.X*b, a.Y*b, a.Z*b,false);
- return node;
- }
- public Node vector_cross(Node a, Node b) {
- Node node = new Node(a.Y * b.Z - a.Z * b.Y,a.Z * b.X - a.X * b.Z,a.X * b.Y - a.Y * b.X,false);
- return node;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement