/*
* Copyright (C) 2008-2015 by Holger Arndt
*
* This file is part of the Universal Java Matrix Package (UJMP).
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* UJMP is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* UJMP is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with UJMP; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package org.ujmp.core;
import java.io.Serializable;
import java.util.Arrays;
import org.ujmp.core.util.MathUtil;
public class Coordinates implements Serializable, Comparable {
private static final long serialVersionUID = 8361257560328772093L;
public static final int X = Matrix.X;
public static final int Y = Matrix.Y;
public static final int Z = Matrix.Z;
public static final int ROW = Matrix.ROW;
public static final int COLUMN = Matrix.COLUMN;
public static final int ALL = Matrix.ALL;
public static final long[] ZERO2D = new long[] { 0, 0 };
/**
* wrapped values
*/
private final long[] coordinates;
/**
* Wraps an array of long values into a Coordinates object with proper
* hashCode(), compareTo() and equals() methods. Use Coordinates.wrap() to
* create a new object.
*
* @param coordinates
* array of long values to wrap
*/
private Coordinates(final long... coordinates) {
this.coordinates = coordinates;
}
public final int hashCode() {
return Arrays.hashCode(coordinates);
}
public final boolean equals(final Coordinates c) {
return Arrays.equals(coordinates, c.coordinates);
}
public static final long product(final long... c) {
long product = 1;
for (int i = c.length - 1; i != -1; i--) {
product *= c[i];
}
return product;
}
public static final long product(final int... c) {
long product = 1;
for (int i = c.length - 1; i != -1; i--) {
product *= c[i];
}
return product;
}
public static final Coordinates wrap(final long... coordinates) {
return new Coordinates(coordinates);
}
public final String toString(final String separator) {
return toString("[", separator, "]");
}
public final String toString() {
return toString("[", ",", "]");
}
public final String toString(final String prefix, final String separator, final String suffix) {
final StringBuilder s = new StringBuilder();
s.append(prefix);
for (int i = 0; i < coordinates.length; i++) {
s.append(coordinates[i]);
if (i < coordinates.length - 1) {
s.append(separator);
}
}
s.append(suffix);
return s.toString();
}
public final boolean equals(final Object o) {
if (this == o) {
return true;
} else if (o instanceof Coordinates) {
return equals((Coordinates) o);
} else {
return false;
}
}
public final void fillWithValue(final long value) {
Arrays.fill(coordinates, value);
}
public final void clear() {
Arrays.fill(coordinates, 0);
}
public static final String toString(final long... coordinates) {
return toString(",", coordinates);
}
public static final String toString(final String separator, final long... coordinates) {
return toString("[", separator, "]", coordinates);
}
public static final String toString(final String prefix, final String separator,
final String suffix, final long... coordinates) {
final StringBuilder s = new StringBuilder();
s.append(prefix);
for (int i = 0; i < coordinates.length; i++) {
s.append(coordinates[i]);
if (i < coordinates.length - 1) {
s.append(separator);
}
}
s.append(suffix);
return s.toString();
}
public final Coordinates clone() {
return Coordinates.wrap(Arrays.copyOf(this.coordinates, this.coordinates.length));
}
public static final long[] plus(final long[] c1, final long[] c2) {
return plus(new long[c1.length], c1, c2);
}
public static final long[] plus(final long[] result, final long[] c1, final long[] c2) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = c1[i] + c2[i];
}
return result;
}
public static final long[] times(final long[] c1, final long[] c2) {
return times(new long[c1.length], c1, c2);
}
public static final long[] times(final long[] result, final long[] c1, final long[] c2) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = c1[i] * c2[i];
}
return result;
}
public static final long[] divide(final long[] c1, final long[] c2) {
return divide(new long[c1.length], c1, c2);
}
public static final long[] divide(final long[] c1, final int[] c2) {
return divide(new long[c1.length], c1, c2);
}
public static final long[] divide(final long[] result, final long[] c1, final long[] c2) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = c1[i] / c2[i];
}
return result;
}
public static final long[] divide(final long[] result, final long[] c1, final int[] c2) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = c1[i] / c2[i];
}
return result;
}
public static final long[] times(final long[] c, final long value) {
return times(new long[c.length], c, value);
}
public static final long[] times(final long[] result, final long[] c, final long value) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = c[i] * value;
}
return result;
}
public static final long[] divide(final long[] c, final long value) {
return divide(new long[c.length], c, value);
}
public static final long[] divide(final long[] result, final long[] c, final long value) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = c[i] / value;
}
return result;
}
public static final long[] modulo(final long[] c1, final long[] c2) {
return modulo(new long[c1.length], c1, c2);
}
public static final long[] modulo(final long result[], final long[] c1, final long[] c2) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = c1[i] % c2[i];
}
return result;
}
public static final long[] minus(final long[] c1, final long[] c2) {
return minus(new long[c1.length], c1, c2);
}
public static final long[] minus(final long[] result, final long[] c1, final long[] c2) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = c1[i] - c2[i];
}
return result;
}
public static final long[] max(final long[] c1, final long[] c2) {
return max(new long[c1.length], c1, c2);
}
public static final long[] max(final long[] result, final long[] c1, final long[] c2) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = Math.max(c1[i], c2[i]);
}
return result;
}
public static final long[] min(final long[] c1, final long[] c2) {
return max(new long[c1.length], c1, c2);
}
public static final long[] min(final long[] result, final long[] c1, final long[] c2) {
for (int i = result.length - 1; i != -1; i--) {
result[i] = Math.min(c1[i], c2[i]);
}
return result;
}
public static final long[] parseString(final String s, final String splitRegex) {
return parseString(s, "[x,;\t]");
}
public static final long[] parseString(final String s) {
final String[] fields = s.split("[,;\tx]");
final long[] result = new long[fields.length];
for (int i = fields.length - 1; i != -1; i--) {
result[i] = Long.parseLong(fields[i]);
}
return result;
}
public final int getDimensionCount() {
return coordinates.length;
}
public static final boolean equals(final long[] c1, final long[] c2) {
return Arrays.equals(c1, c2);
}
public static final boolean equals(final int[] c1, final int[] c2) {
return Arrays.equals(c1, c2);
}
public static final long[] copyOf(final long[] c) {
return Arrays.copyOf(c, c.length);
}
public static final long[] transpose(final long[] c) {
return transpose(new long[c.length], c, ROW, COLUMN);
}
public static final long[] transpose(final long[] c, final int swapDimension1,
final int swapDimension2) {
return transpose(new long[c.length], c, swapDimension1, swapDimension2);
}
public static final long[] transpose(final long[] result, final long[] c,
final int swapDimension1, final int swapDimension2) {
if (result == c) {
final long temp = c[swapDimension1];
result[swapDimension1] = c[swapDimension2];
result[swapDimension2] = temp;
} else {
result[swapDimension1] = c[swapDimension2];
result[swapDimension2] = c[swapDimension1];
}
return result;
}
public static final boolean isSmallerThan(final long[] coordinates, final long[] size) {
for (int i = coordinates.length - 1; i != -1; i--) {
if (coordinates[i] >= size[i])
return false;
}
return true;
}
public static final boolean isSmallerOrEqual(final long[] coordinates, final long[] size) {
for (int i = coordinates.length - 1; i != -1; i--) {
if (coordinates[i] > size[i])
return false;
}
return true;
}
public static final boolean isGreaterThan(final long[] coordinates, final long[] size) {
for (int i = coordinates.length - 1; i != -1; i--) {
if (coordinates[i] <= size[i])
return false;
}
return true;
}
public static final boolean isGreaterOrEqual(final long[] coordinates, final long[] size) {
for (int i = coordinates.length - 1; i != -1; i--) {
if (coordinates[i] < size[i])
return false;
}
return true;
}
public static final long[] minus(final long[] coordinates, final long value) {
return minus(new long[coordinates.length], coordinates, value);
}
public static final long[] minus(final long[] result, final long[] coordinates, final long value) {
for (int i = coordinates.length - 1; i != -1; i--) {
result[i] = coordinates[i] - value;
}
return result;
}
public static final long[] plus(final long[] coordinates, final long value) {
return plus(new long[coordinates.length], coordinates, value);
}
public static final long[] plus(final long[] result, final long[] coordinates, final long value) {
for (int i = coordinates.length - 1; i != -1; i--) {
result[i] = coordinates[i] + value;
}
return result;
}
public static final boolean allEquals(final long[] coordinates, final long value) {
for (int i = coordinates.length - 1; i != -1; i--) {
if (coordinates[i] != value)
return false;
}
return true;
}
public static final long manhattenDistance(final long[] c1, final long[] c2) {
long distance = 0;
for (int i = c1.length - 1; i != -1; i--) {
distance += Math.abs(c1[i] - c2[i]);
}
return distance;
}
public final int compareTo(final Coordinates coordinates) {
if (coordinates == null) {
throw new IllegalArgumentException("coordinates cannot be null");
} else {
final long distance = manhattenDistance(this.coordinates, coordinates.coordinates);
return MathUtil.longToIntClip(distance);
}
}
public final long[] getLongCoordinates() {
return this.coordinates;
}
public final long getRow() {
return coordinates[ROW];
}
public final long getColumn() {
return coordinates[COLUMN];
}
}
Ads help maintain this website.