/*
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.
*/
/*
* AlgoMidPoint.java
*
* Created on 24. September 2001, 21:37
*/
package org.geogebra.common.kernel.algos;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.HashSet;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.geos.GeoPoint;
import org.geogebra.common.kernel.kernelND.AlgoMidpointND;
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 AlgoMidpoint extends AlgoMidpointND
implements SymbolicParametersAlgo, SymbolicParametersBotanaAlgo {
private PPolynomial[] polynomials;
private PPolynomial[] botanaPolynomials;
private PVariable[] botanaVars;
public AlgoMidpoint(Construction cons, String label, GeoPoint P,
GeoPoint Q) {
this(cons, P, Q);
getPoint().setLabel(label);
}
public AlgoMidpoint(Construction cons, GeoPoint P, GeoPoint Q) {
super(cons, P, Q);
}
@Override
protected GeoPointND newGeoPoint(Construction cons) {
return new GeoPoint(cons);
}
@Override
public GeoPoint getPoint() {
return (GeoPoint) super.getPoint();
}
@Override
protected void copyCoords(GeoPointND point) {
getPoint().setCoords((GeoPoint) point);
}
// Made public for LocusEqu
@Override
public GeoPoint getP() {
return (GeoPoint) super.getP();
}
// Made public for LocusEqu
@Override
public GeoPoint getQ() {
return (GeoPoint) super.getQ();
}
@Override
protected void computeMidCoords() {
GeoPoint P = getP();
GeoPoint Q = getQ();
getPoint().setCoords((P.inhomX + Q.inhomX) / 2.0d,
(P.inhomY + Q.inhomY) / 2.0d, 1.0);
}
@Override
public SymbolicParameters getSymbolicParameters() {
return new SymbolicParameters(this);
}
@Override
public void getFreeVariables(HashSet<PVariable> variables)
throws NoSymbolicParametersException {
GeoPoint P = getP();
GeoPoint Q = getQ();
if (P != null && Q != null) {
P.getFreeVariables(variables);
Q.getFreeVariables(variables);
return;
}
throw new NoSymbolicParametersException();
}
@Override
public int[] getDegrees() throws NoSymbolicParametersException {
GeoPoint P = getP();
GeoPoint Q = getQ();
if (P != null && Q != null) {
int[] degreeP = P.getDegrees();
int[] degreeQ = Q.getDegrees();
int[] result = new int[3];
result[0] = Math.max(degreeP[0] + degreeQ[2],
degreeQ[0] + degreeP[2]);
result[1] = Math.max(degreeP[1] + degreeQ[2],
degreeQ[1] + degreeP[2]);
result[2] = degreeP[2] + degreeQ[2];
return result;
}
throw new NoSymbolicParametersException();
}
@Override
public BigInteger[] getExactCoordinates(
HashMap<PVariable, BigInteger> values)
throws NoSymbolicParametersException {
GeoPoint P = getP();
GeoPoint Q = getQ();
if (P != null && Q != null) {
BigInteger[] pP = P.getExactCoordinates(values);
BigInteger[] pQ = Q.getExactCoordinates(values);
BigInteger[] coords = new BigInteger[3];
coords[0] = pP[0].multiply(pQ[2]).add(pQ[0].multiply(pP[2]));
coords[1] = pP[1].multiply(pQ[2]).add(pQ[1].multiply(pP[2]));
coords[2] = pP[2].multiply(pQ[2]).multiply(BigInteger.valueOf(2));
return coords;
}
throw new NoSymbolicParametersException();
}
@Override
public PPolynomial[] getPolynomials() throws NoSymbolicParametersException {
if (polynomials != null) {
return polynomials;
}
GeoPoint P = getP();
GeoPoint Q = getQ();
if (P != null && Q != null) {
PPolynomial[] pP = P.getPolynomials();
PPolynomial[] pQ = Q.getPolynomials();
polynomials = new PPolynomial[3];
polynomials[0] = pP[0].multiply(pQ[2]).add(pQ[0].multiply(pP[2]));
polynomials[1] = pP[1].multiply(pQ[2]).add(pQ[1].multiply(pP[2]));
polynomials[2] = pP[2].multiply(pQ[2]).multiply(new PPolynomial(2));
return polynomials;
}
throw new NoSymbolicParametersException();
}
@Override
public PVariable[] getBotanaVars(GeoElementND geo) {
return botanaVars;
}
@Override
public PPolynomial[] getBotanaPolynomials(GeoElementND geo)
throws NoSymbolicParametersException {
if (botanaPolynomials != null) {
return botanaPolynomials;
}
GeoPoint P = getP();
GeoPoint Q = getQ();
if (P == null || Q == null) {
throw new NoSymbolicParametersException();
}
if (botanaVars == null) {
botanaVars = new PVariable[2];
botanaVars[0] = new PVariable(kernel);
botanaVars[1] = new PVariable(kernel);
}
botanaPolynomials = SymbolicParameters.botanaPolynomialsMidpoint(P, Q,
botanaVars);
return botanaPolynomials;
}
}