All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.tsl2.nano.math.vector.Coordinate Maven / Gradle / Ivy

/*
 * File: $HeadURL$
 * Id  : $Id$
 * 
 * created by: ts
 * created on: 09.04.2012
 * 
 * Copyright: (c) Thomas Schneider 2012, all rights reserved
 */
package de.tsl2.nano.math.vector;

import java.io.Serializable;
import java.util.Arrays;

/**
 * Basic simple handling n-dim coordinate. the coordinates are floats, as they will fulfill most cases.
 * 

* It is not possible to use java generics, because no primitives are possible. If you use the wrappers of type Number, * you are not able to do math calculations. * *

 * Example:
 *  public class Coordinate {
 *  ...
 *     public void add(T... v) {
 *         checkDimension(v);
 *         for (int i = 0; i < v.length; i++) {
 *         // this is not possible, as the generic type T cannot use autoboxing
 *             x[i] = x[i] + v[i];
 *         }
 *     }
 *     ...
 *     }
 * 
* * @author ts * @version $Revision$ */ public class Coordinate implements Serializable { /** serialVersionUID */ private static final long serialVersionUID = -3712289206658197158L; public float[] x; /** * @param v coordinate */ public Coordinate(float... v) { super(); this.x = v; } public void set(float... v) { checkDimension(v); System.arraycopy(v, 0, x, 0, v.length); } /** * set new coordinate * @param v new coordinate */ public void set(Coordinate v) { set(v.x); } /** * checkDimension * * @param v coordinate to check */ protected final void checkDimension(float... v) { checkDimension(x.length, v); } /** * checkDimension * * @param dim dimension * @param v coordinate * @return given coordinate */ protected static final float[] checkDimension(int dim, float... v) { if (dim != v.length) { throw new RuntimeException("the given vector " + v + " must have the dimension " + dim); } return v; } /** * @return vector dimension */ public int dimension() { return x.length; } /** * add * @param v coordinate to add */ public void add(float... v) { checkDimension(v); for (int i = 0; i < v.length; i++) { x[i] = x[i] + v[i]; } } /** * scale * @param v coordinate to scale */ public void scale(float... v) { checkDimension(v); for (int i = 0; i < v.length; i++) { x[i] *= v[i]; } } // public void scale(Vector v) { // scale(v.x); // } /** * scale * * @param f single scale factor */ public void scale(float f) { for (int i = 0; i < x.length; i++) { x[i] *= f; } } /** * clone with adaption. convenience for clone+scale. * @param adapt adaption factor for new coordinate * @return */ public Vector clone(float adapt) { float[] n = new float[x.length]; for (int i = 0; i < n.length; i++) { n[i] = x[i] * adapt; } return new Vector(n); } /** * {@inheritDoc} */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Arrays.hashCode(x); return result; } /** * {@inheritDoc} */ @Override public boolean equals(Object o) { return Arrays.equals(x, ((Coordinate)o).x); } /** * {@inheritDoc} */ @Override public String toString() { StringBuilder buf = new StringBuilder(); for (int i = 0; i < x.length; i++) { buf.append(String.format("%10.2f,", x[i])); } return buf.substring(0, buf.length() - 1); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy