package org.geogebra.common.kernel.Matrix;
/**
* class for 3 floats (x, y, z)
*
* @author mathieu
*
*/
public abstract class Coords3 {
/** undefined vector */
public static final Coords3 UNDEFINED = new CoordsFloat3(0f, 0f, 0f) {
@Override
public boolean isNotFinalUndefined() {
return false;
}
@Override
public boolean isFinalUndefined() {
return true;
}
};
/**
* set values
*
* @param x
* x coord
* @param y
* y coord
* @param z
* z coord
*/
abstract public void set(float x, float y, float z);
/**
* set values
*
* @param x
* x coord
* @param y
* y coord
* @param z
* z coord
*/
abstract public void set(double x, double y, double z);
/**
* returns false if one value equals NaN
*
* @return false if one value equals NaN
*/
abstract public boolean isDefined();
/**
* @return true if not a final (constant) undefined
*/
public boolean isNotFinalUndefined() {
return true;
}
/**
* @return true if a final (constant) undefined
*/
public boolean isFinalUndefined() {
return false;
}
/**
* returns a copy of the vector
*
* @return a copy of the vector
*/
abstract public Coords3 copyVector();
/**
* add values of v inside this
*
* @param v
* vector
*/
abstract public void addInside(Coords3 v);
/**
* multiply all values by v
*
* @param v
* factor
*/
abstract public void mulInside(float v);
/**
* multiply all values by v
*
* @param v
* factor
*/
abstract public void mulInside(double v);
/**
* multiply values by a/b/c
*
* @param a
* x factor
* @param b
* y factor
* @param c
* z factor
*
*/
abstract public void mulInside(double a, double b, double c);
/**
* normalize this (if norm != 0)
*/
abstract public void normalizeIfPossible();
/**
* set this to v normalized or (0, 0, 0) if v=0
*
* @param v
* vector
*/
final public void setNormalizedIfPossible(Coords v) {
double vx = v.getX();
double vy = v.getY();
double vz = v.getZ();
double f = 1 / Math.sqrt(vx * vx + vy * vy + vz * vz);
if (Double.isNaN(f)) {
set(0, 0, 0);
} else {
set(vx * f, vy * f, vz * f);
}
}
/**
*
* @return x coord
*/
abstract public double getXd();
/**
*
* @return x coord
*/
abstract public double getYd();
/**
*
* @return x coord
*/
abstract public double getZd();
/**
*
* @return x coord
*/
abstract public float getXf();
/**
*
* @return x coord
*/
abstract public float getYf();
/**
*
* @return x coord
*/
abstract public float getZf();
}