package org.geogebra.common.kernel.implicit; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.algos.AlgoElement; import org.geogebra.common.kernel.arithmetic.Equation; import org.geogebra.common.kernel.arithmetic.ExpressionNode; import org.geogebra.common.kernel.arithmetic.FunctionNVar; import org.geogebra.common.kernel.arithmetic.FunctionVariable; import org.geogebra.common.kernel.arithmetic.MyDouble; import org.geogebra.common.kernel.arithmetic.Polynomial; import org.geogebra.common.kernel.commands.Commands; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoFunctionNVar; import org.geogebra.common.main.MyError; import org.geogebra.common.util.debug.Log; /** * Computes */ public class AlgoImplicitPolyFunction extends AlgoElement { private GeoFunctionNVar function; // input private GeoImplicit implicitPoly; // output /** * @param c * construction * @param label * label * @param func * function */ public AlgoImplicitPolyFunction(Construction c, String label, GeoFunctionNVar func) { super(c); function = func; implicitPoly = kernel.newImplicitPoly(cons); setInputOutput(); compute(); implicitPoly.setLabel(label); } @Override public void compute() { implicitPoly.setDefined(); FunctionNVar f = function.getFunction(); FunctionVariable[] fvars = f.getFunctionVariables(); if (fvars.length != 2) { implicitPoly.setUndefined(); return; } try { ExpressionNode en = f.getExpression().getCopy(kernel); /* * FunctionVariable xVar=new FunctionVariable(kernel,"x"); * FunctionVariable yVar=new FunctionVariable(kernel,"y"); * en.replace(fvars[0], xVar); en.replace(fvars[1], yVar); */ Equation equ = new Equation(kernel, en, new MyDouble(kernel)); equ.initEquation(); Polynomial poly = equ.getNormalForm(); implicitPoly.fromEquation(equ, null); if (equ.mayBePolynomial()) { implicitPoly.setCoeff(poly.getCoeff()); } else { implicitPoly.setCoeff((double[][]) null); } } catch (MyError e) { Log.debug(e.getMessage()); implicitPoly.setUndefined(); } } @Override protected void setInputOutput() { input = new GeoElement[] { function }; setOutputLength(1); setOutput(0, implicitPoly.toGeoElement()); setDependencies(); // done by AlgoElement } @Override public Commands getClassName() { return Commands.ImplicitCurve; } /** * @return resulting polynomial */ public GeoImplicit getImplicitPoly() { return implicitPoly; } }