/* * Copyright (c) 2016 Martin Davis. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * * http://www.eclipse.org/org/documents/edl-v10.php. */ package org.locationtech.jts.math; import org.locationtech.jts.geom.Coordinate; /** * Represents a vector in 3-dimensional Cartesian space. * * @author mdavis * */ public class Vector3D { /** * Computes the dot product of the 3D vectors AB and CD. * * @param A * @param B * @param C * @param D * @return the dot product */ public static double dot(Coordinate A, Coordinate B, Coordinate C, Coordinate D) { double ABx = B.x - A.x; double ABy = B.y - A.y; double ABz = B.z - A.z; double CDx = D.x - C.x; double CDy = D.y - C.y; double CDz = D.z - C.z; return ABx*CDx + ABy*CDy + ABz*CDz; } /** * Creates a new vector with given X and Y components. * * @param x * the x component * @param y * the y component * @param z * the z component * @return a new vector */ public static Vector3D create(double x, double y, double z) { return new Vector3D(x, y, z); } /** * Creates a vector from a {@link Coordinate}. * * @param coord * the Coordinate to copy * @return a new vector */ public static Vector3D create(Coordinate coord) { return new Vector3D(coord); } public Vector3D(Coordinate v) { x = v.x; y = v.y; z = v.z; } /** * Computes the 3D dot-product of two {@link Coordinate}s. * * @param v1 the first vector * @param v2 the second vector * @return the dot product of the vectors */ public static double dot(Coordinate v1, Coordinate v2) { return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; } private double x; private double y; private double z; public Vector3D(Coordinate from, Coordinate to) { x = to.x - from.x; y = to.y - from.y; z = to.z - from.z; } public Vector3D(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } public double getX() { return x; } public double getY() { return y; } public double getZ() { return z; } /** * Computes the dot-product of two vectors * * @param v * a vector * @return the dot product of the vectors */ public double dot(Vector3D v) { return x * v.x + y * v.y + z * v.z; } public double length() { return Math.sqrt(x * x + y * y + z * z); } public static double length(Coordinate v) { return Math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z); } public Vector3D normalize() { double length = length(); if (length > 0.0) return divide(length()); return create(0.0, 0.0, 0.0); } private Vector3D divide(double d) { return create(x / d, y / d, z / d); } public static Coordinate normalize(Coordinate v) { double len = length(v); return new Coordinate(v.x / len, v.y / len, v.z / len); } /** * Gets a string representation of this vector * * @return a string representing this vector */ public String toString() { return "[" + x + ", " + y + ", " + z + "]"; } }