/*
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.
*/
/*
* AlgoParabolaPointLine.java
*
* Created on 15. November 2001, 21:37
*/
package org.geogebra.common.kernel.algos;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.geos.GeoConic;
import org.geogebra.common.kernel.geos.GeoLine;
import org.geogebra.common.kernel.geos.GeoPoint;
import org.geogebra.common.kernel.kernelND.GeoConicND;
import org.geogebra.common.kernel.kernelND.GeoElementND;
import org.geogebra.common.kernel.kernelND.GeoLineND;
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;
import org.geogebra.common.util.debug.Log;
/**
*
* @author Markus
*/
public class AlgoParabolaPointLine extends AlgoParabolaPointLineND
implements SymbolicParametersBotanaAlgo {
private PPolynomial[] botanaPolynomials;
private PVariable[] botanaVars;
public AlgoParabolaPointLine(Construction cons, String label, GeoPointND F,
GeoLineND l) {
super(cons, label, F, l);
}
public AlgoParabolaPointLine(Construction cons, GeoPointND F, GeoLineND l) {
super(cons, F, l);
}
@Override
protected GeoConicND newGeoConic(Construction cons) {
return new GeoConic(cons);
}
// compute parabola with focus F and line l
@Override
public final void compute() {
parabola.setParabola((GeoPoint) F, (GeoLine) line);
}
@Override
public PVariable[] getBotanaVars(GeoElementND geo) {
return botanaVars;
}
@Override
public PPolynomial[] getBotanaPolynomials(GeoElementND geo)
throws NoSymbolicParametersException {
if (botanaPolynomials != null) {
return botanaPolynomials;
}
GeoPoint F1 = (GeoPoint) this.F;
GeoLine l1 = (GeoLine) this.line;
if (F1 != null && l1 != null) {
PVariable[] vF = F1.getBotanaVars(F1);
PVariable[] vl = l1.getBotanaVars(l1);
if (botanaVars == null) {
botanaVars = new PVariable[10];
// P
botanaVars[0] = new PVariable(kernel);
botanaVars[1] = new PVariable(kernel);
// T
botanaVars[2] = new PVariable(kernel);
botanaVars[3] = new PVariable(kernel);
// A
botanaVars[4] = vl[0];
botanaVars[5] = vl[1];
// B
botanaVars[6] = vl[2];
botanaVars[7] = vl[3];
// F
botanaVars[8] = vF[0];
botanaVars[9] = vF[1];
Log.trace("Parabola " + geo.getLabelSimple() + "("
+ botanaVars[0] + "," + botanaVars[1]
+ ") implicitly introduces feet point (" + botanaVars[2]
+ "," + botanaVars[3] + ") on directrix "
+ l1.getLabelSimple());
}
botanaPolynomials = new PPolynomial[3];
// |FP| = |PT|
botanaPolynomials[0] = PPolynomial.equidistant(vF[0], vF[1],
botanaVars[0], botanaVars[1], botanaVars[2], botanaVars[3]);
// A,T,B collinear
botanaPolynomials[1] = PPolynomial.collinear(vl[0], vl[1], vl[2],
vl[3], botanaVars[2], botanaVars[3]);
// PT orthogonal AB
botanaPolynomials[2] = PPolynomial.perpendicular(botanaVars[0],
botanaVars[1], botanaVars[2], botanaVars[3], vl[0], vl[1],
vl[2], vl[3]);
return botanaPolynomials;
}
throw new NoSymbolicParametersException();
}
}