/*
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.
*/
/*
* AlgoDistancePoints.java
*
* Created on 30. August 2001, 21:37
*/
package org.geogebra.common.kernel.algos;
import org.geogebra.common.euclidian.EuclidianConstants;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.StringTemplate;
import org.geogebra.common.kernel.commands.Commands;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.common.kernel.geos.GeoPoint;
import org.geogebra.common.kernel.kernelND.GeoElementND;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.kernel.prover.NoSymbolicParametersException;
import org.geogebra.common.kernel.prover.polynomial.PPolynomial;
import org.geogebra.common.kernel.prover.polynomial.PVariable;
/**
*
* @author Markus
*/
public class AlgoDistancePoints extends AlgoElement
implements DistanceAlgo, SymbolicParametersBotanaAlgo {
private GeoPointND P, Q; // input
private GeoNumeric dist; // output
private PVariable[] botanaVars;
public AlgoDistancePoints(Construction cons, GeoPointND P, GeoPointND Q) {
super(cons);
this.P = P;
this.Q = Q;
dist = new GeoNumeric(cons);
setInputOutput(); // for AlgoElement
// compute length
compute();
}
public AlgoDistancePoints(Construction cons, String label, GeoPointND P,
GeoPointND Q) {
this(cons, P, Q);
dist.setLabel(label);
}
@Override
public Commands getClassName() {
return Commands.Distance;
}
@Override
public int getRelatedModeID() {
return EuclidianConstants.MODE_DISTANCE;
}
// for AlgoElement
@Override
protected void setInputOutput() {
input = new GeoElement[2];
input[0] = (GeoElement) P;
input[1] = (GeoElement) Q;
super.setOutputLength(1);
super.setOutput(0, dist);
setDependencies(); // done by AlgoElement
}
@Override
public GeoNumeric getDistance() {
return dist;
}
/*
* GeoPoint getP() { return P; } GeoPoint getQ() { return Q; }
*/
// calc length of vector v
@Override
public final void compute() {
dist.setValue(P.distance(Q));
}
@Override
final public String toString(StringTemplate tpl) {
// Michael Borcherds 2008-03-30
// simplified to allow better Chinese translation
return getLoc().getPlain("DistanceOfAandB", P.getLabel(tpl),
Q.getLabel(tpl));
}
@Override
public PVariable[] getBotanaVars(GeoElementND geo) {
return botanaVars;
}
@Override
public PPolynomial[] getBotanaPolynomials(GeoElementND geo)
throws NoSymbolicParametersException {
GeoPoint P1 = (GeoPoint) P;
GeoPoint P2 = (GeoPoint) Q;
if (P1 != null && P2 != null) {
PVariable[] vP1 = P1.getBotanaVars(P1);
PVariable[] vP2 = P2.getBotanaVars(P2);
if (botanaVars == null) {
botanaVars = new PVariable[4];
botanaVars[0] = vP1[0];
botanaVars[1] = vP1[1];
botanaVars[2] = vP2[0];
botanaVars[3] = vP2[1];
}
return null;
}
throw new NoSymbolicParametersException();
}
}