package com.revolsys.geometry.model.impl;
import java.io.Serializable;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.Point;
public class PointDouble extends AbstractPoint implements Serializable {
private static final long serialVersionUID = 1L;
private double[] coordinates;
public PointDouble(final double... coordinates) {
final int axisCount = coordinates.length;
this.coordinates = new double[axisCount];
for (int i = 0; i < axisCount; i++) {
double value;
if (i < coordinates.length) {
value = coordinates[i];
} else {
value = java.lang.Double.NaN;
}
this.coordinates[i] = value;
}
}
protected PointDouble(final GeometryFactory geometryFactory, final double... coordinates) {
if (coordinates != null && coordinates.length > 0) {
final int axisCount = geometryFactory.getAxisCount();
this.coordinates = new double[axisCount];
for (int i = 0; i < axisCount; i++) {
double value;
if (i < coordinates.length) {
value = geometryFactory.makePrecise(i, coordinates[i]);
} else {
value = java.lang.Double.NaN;
}
this.coordinates[i] = value;
}
}
}
@Override
public PointDouble clone() {
final PointDouble point = (PointDouble)super.clone();
if (this.coordinates != null) {
point.coordinates = this.coordinates.clone();
}
return point;
}
@Override
public void copyCoordinates(final double[] coordinates) {
int axisCount = this.coordinates.length;
if (coordinates.length < axisCount) {
axisCount = coordinates.length;
}
System.arraycopy(this.coordinates, 0, coordinates, 0, axisCount);
}
@Override
public int getAxisCount() {
if (this.coordinates == null) {
return 0;
} else {
return (byte)this.coordinates.length;
}
}
@Override
public double getCoordinate(final int axisIndex) {
if (isEmpty()) {
return java.lang.Double.NaN;
} else {
final int axisCount = getAxisCount();
if (axisIndex >= 0 && axisIndex < axisCount) {
return this.coordinates[axisIndex];
} else {
return java.lang.Double.NaN;
}
}
}
@Override
public double[] getCoordinates() {
if (this.coordinates == null) {
return this.coordinates;
} else {
return this.coordinates.clone();
}
}
@Override
public double getX() {
return this.coordinates[0];
}
@Override
public double getY() {
return this.coordinates[1];
}
@Override
public boolean isEmpty() {
return this.coordinates == null;
}
@Override
public Point move(final double... deltas) {
if (deltas == null || isEmpty()) {
return this;
} else {
final double[] coordinates = this.coordinates.clone();
final int axisCount = Math.min(deltas.length, getAxisCount());
for (int axisIndex = 0; axisIndex < axisCount; axisIndex++) {
coordinates[axisIndex] += deltas[axisIndex];
}
return new PointDouble(coordinates);
}
}
}