package org.geogebra.common.geogebra3D.kernel3D.algos;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoVector3D;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.Matrix.Coords;
import org.geogebra.common.kernel.algos.AlgoUnitVector;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.kernelND.GeoDirectionND;
import org.geogebra.common.kernel.kernelND.GeoLineND;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.kernel.kernelND.GeoVectorND;
public class AlgoUnitVector3D extends AlgoUnitVector {
public AlgoUnitVector3D(Construction cons, GeoDirectionND line,
boolean normalize) {
super(cons, (GeoElement) line, normalize);
}
@Override
protected GeoVectorND createVector(Construction cons) {
GeoVector3D ret = new GeoVector3D(cons);
return ret;
}
@Override
public final void compute() {
Coords coords = ((GeoDirectionND) inputGeo).getDirectionInD3();
length = coords.norm();
if (!normalize) {
((GeoVector3D) u).setCoords(coords);
} else if (Kernel.isZero(length)) {
u.setUndefined();
} else {
((GeoVector3D) u).setCoords(coords.mul(1 / length));
}
}
@Override
protected GeoPointND getInputStartPoint() {
if (inputGeo.isGeoLine()) {
return ((GeoLineND) inputGeo).getStartPoint();
}
if (inputGeo.isGeoVector()) {
return ((GeoVectorND) inputGeo).getStartPoint();
}
return null; // TODO start point for GeoDirectionND
}
}