/*
GeoGebra - Dynamic Mathematics for Everyone
http://www.geogebra.org
This file is part of GeoGebra.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation.
*/
package org.geogebra.common.kernel.algos;
import org.geogebra.common.euclidian.draw.DrawAngle;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Matrix.Coords;
import org.geogebra.common.kernel.geos.GeoPoint;
import org.geogebra.common.kernel.geos.GeoVec3D;
import org.geogebra.common.kernel.geos.GeoVector;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.kernel.kernelND.GeoVectorND;
public class AlgoAngleVector extends AlgoAngleVectorND {
private double[] coords;
public AlgoAngleVector(Construction cons, String label, GeoVec3D vec) {
super(cons, label, vec);
}
public GeoVec3D getVec3D() {
return (GeoVec3D) vec;
}
@Override
public final void compute() {
if (coords == null) {
coords = new double[2];
}
((GeoVec3D) vec).getInhomCoords(coords);
angle.setValue(Math.atan2(coords[1], coords[0]));
}
@Override
public boolean updateDrawInfo(double[] m, double[] firstVec,
DrawAngle drawable) {
if (vec.isGeoVector()) {
GeoPointND vertex = getStartPoint((GeoVector) vec);
if (vertex != null) {
vertex.getInhomCoords(m);
}
return vertex != null && vertex.isDefined() && !vertex.isInfinite();
}
m[0] = 0;
m[1] = 0;
return vec.isDefined();
}
@Override
public boolean getCoordsInD3(Coords[] drawCoords) {
if (vec.isGeoVector()) {
GeoPointND vertex = getStartPoint((GeoVectorND) vec);
if (centerIsNotDrawable(vertex)) {
return false;
}
drawCoords[0] = vertex.getInhomCoordsInD3();
drawCoords[2] = ((GeoVector) vec).getCoordsInD3();
} else {
drawCoords[0] = Coords.O;
drawCoords[2] = ((GeoPoint) vec).getCoordsInD3();
drawCoords[2].setW(0);
}
drawCoords[1] = Coords.VX;
return true;
}
}