/*
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.
*/
/*
* AlgoAngleVector.java
*
* Created on 30. August 2001, 21:37
*/
package org.geogebra.common.kernel.algos;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoVector;
import org.geogebra.common.kernel.kernelND.GeoElementND;
import org.geogebra.common.kernel.kernelND.GeoVectorND;
public class AlgoAngleVectors extends AlgoAngleVectorsND {
public AlgoAngleVectors(Construction cons, String label, GeoVectorND v,
GeoVectorND w) {
super(cons, label, v, w, null);
}
// for AlgoElement
@Override
protected void setInputOutput() {
input = new GeoElement[2];
input[0] = (GeoElement) v;
input[1] = (GeoElement) w;
setOutputLength(1);
setOutput(0, angle);
setDependencies(); // done by AlgoElement
}
// calc angle between vectors v and w
// angle in range [0, 2pi)
// use normalvector to
@Override
public void compute() {
// |v| * |w| * sin(alpha) = det(v, w)
// cos(alpha) = v . w / (|v| * |w|)
// tan(alpha) = sin(alpha) / cos(alpha)
// => tan(alpha) = det(v, w) / v . w
double det = ((GeoVector) v).x * ((GeoVector) w).y
- ((GeoVector) v).y * ((GeoVector) w).x;
double prod = ((GeoVector) v).x * ((GeoVector) w).x
+ ((GeoVector) v).y * ((GeoVector) w).y;
double value = Math.atan2(det, prod);
angle.setValue(value);
}
// ///////////////////////////////
// TRICKS FOR XOY PLANE
// ///////////////////////////////
@Override
protected int getInputLengthForXML() {
return getInputLengthForXMLMayNeedXOYPlane();
}
@Override
protected int getInputLengthForCommandDescription() {
return getInputLengthForCommandDescriptionMayNeedXOYPlane();
}
@Override
public GeoElementND getInput(int i) {
return getInputMaybeXOYPlane(i);
}
}