/*
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.
*/
/*
* AlgoAnglePoints.java
*
* Created on 30. August 2001, 21:37
*/
package org.geogebra.common.geogebra3D.kernel3D.algos;
import org.geogebra.common.euclidian.draw.DrawAngle;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoAngle3D;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Matrix.Coords;
import org.geogebra.common.kernel.algos.AlgoAngleVectorND;
import org.geogebra.common.kernel.geos.GeoAngle;
import org.geogebra.common.kernel.geos.GeoElement;
/**
*
* @author mathieu
*/
public abstract class AlgoAngleElement3D extends AlgoAngleVectorND {
private Coords vn, v2;
public AlgoAngleElement3D(Construction cons, String label, GeoElement vec) {
super(cons, label, vec);
}
@Override
final protected GeoAngle newGeoAngle(Construction cons1) {
GeoAngle ret = new GeoAngle3D(cons1);
ret.setDrawable(true);
return ret;
}
protected abstract Coords getVectorCoords();
protected abstract Coords getOrigin();
protected abstract void setOrigin();
@Override
public final void compute() {
// vectors directions
v2 = getVectorCoords();
// calc angle
v2.calcNorm();
double l2 = v2.getNorm();
double c = v2.getX() / l2; // cosinus of the angle
getAngle().setValue(AlgoAnglePoints3D.acos(c));
// normal vector
vn = AlgoAnglePoints3D.forceNormalVector(Coords.VX, v2);
// start point
setOrigin();
}
@Override
public Coords getVn() {
return vn;
}
@Override
public boolean getCoordsInD3(Coords[] drawCoords) {
if (!getOrigin().isDefined()) {
return false;
}
drawCoords[0] = getOrigin();
drawCoords[1] = Coords.VX;
drawCoords[2] = v2;
return true;
}
@Override
public boolean updateDrawInfo(double[] m, double[] firstVec,
DrawAngle drawable) {
if (vec.isGeoVector()) {
if (!getOrigin().isDefined()) {
return false;
}
if (!drawable.inView(getOrigin())) {
return false;
}
}
if (!drawable.inView(v2)) {
return false;
}
// origin
m[0] = getOrigin().get()[0];
m[1] = getOrigin().get()[1];
// first vec
firstVec[0] = 1;
firstVec[1] = 0;
return true;
}
}