package com.opendoorlogistics.core.distances.external;
public class ThreeDPoint implements InsertionOnlySpatialTree.SpatialTreeCoord {
double x;
double y;
double z;
public ThreeDPoint(double x, double y, double z) {
this.x = x;
this.y = y;
this.z = z;
}
public ThreeDPoint() {
}
public ThreeDPoint(ThreeDPoint pnt) {
this(pnt.x, pnt.y, pnt.z);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(x);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(y);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(z);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ThreeDPoint other = (ThreeDPoint) obj;
if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x))
return false;
if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y))
return false;
if (Double.doubleToLongBits(z) != Double.doubleToLongBits(other.z))
return false;
return true;
}
public double get(int indx) {
switch (indx) {
case 0:
return x;
case 1:
return y;
case 2:
return z;
default:
throw new IllegalArgumentException();
}
}
public void set(int indx, double value) {
switch (indx) {
case 0:
x = value;
break;
case 1:
y = value;
break;
case 2:
z = value;
break;
default:
throw new IllegalArgumentException();
}
}
public static ThreeDPoint subtract(ThreeDPoint a, ThreeDPoint b) {
ThreeDPoint ret = new ThreeDPoint(a);
for (int i = 0; i < 3; i++) {
ret.set(i, ret.get(i) - b.get(i));
}
return ret;
}
public static ThreeDPoint add(ThreeDPoint a, ThreeDPoint b) {
ThreeDPoint ret = new ThreeDPoint(a);
for (int i = 0; i < 3; i++) {
ret.set(i, ret.get(i) + b.get(i));
}
return ret;
}
public static ThreeDPoint multiply(ThreeDPoint a, Double f) {
ThreeDPoint ret = new ThreeDPoint(a);
for (int i = 0; i < 3; i++) {
ret.set(i, ret.get(i) * f);
}
return ret;
}
public static ThreeDPoint average(ThreeDPoint a, ThreeDPoint b) {
ThreeDPoint c = add(a, b);
return multiply(c, 0.5);
}
public static double absSqd(ThreeDPoint p) {
return p.x * p.x + p.y * p.y + p.z * p.z;
}
public static ThreeDPoint round(ThreeDPoint p){
p = new ThreeDPoint(p);
for(int i =0;i<3 ; i++){
p.set(i, Math.round(p.get(i)));
}
return p;
}
}