package jscl.math.operator; import jscl.AngleUnit; import jscl.JsclMathEngine; import jscl.math.Generic; import jscl.math.NotIntegrableException; import jscl.math.Variable; import jscl.mathml.MathML; import jscl.text.msg.JsclMessage; import jscl.text.msg.Messages; import org.solovyev.common.msg.MessageType; import javax.annotation.Nonnull; public class IndefiniteIntegral extends Operator { public static final String NAME = "∫"; public IndefiniteIntegral(Generic expression, Generic variable) { super(NAME, new Generic[]{expression, variable}); } protected IndefiniteIntegral(@Nonnull Generic[] parameters) { super(NAME, parameters); } @Override public int getMinParameters() { return 2; } public Generic selfExpand() { if (JsclMathEngine.getInstance().getAngleUnits() != AngleUnit.rad) { JsclMathEngine.getInstance().getMessageRegistry().addMessage(new JsclMessage(Messages.msg_24, MessageType.warning)); } Variable variable = parameters[1].variableValue(); try { return parameters[0].antiDerivative(variable); } catch (NotIntegrableException e) { } return expressionValue(); } @Nonnull @Override protected String formatUndefinedParameter(int i) { switch (i) { case 0: return "f(x)"; case 1: return "x"; default: return super.formatUndefinedParameter(i); } } public void toMathML(MathML element, Object data) { int exponent = data instanceof Integer ? (Integer) data : 1; if (exponent == 1) bodyToMathML(element); else { MathML e1 = element.element("msup"); MathML e2 = element.element("mfenced"); bodyToMathML(e2); e1.appendChild(e2); e2 = element.element("mn"); e2.appendChild(element.text(String.valueOf(exponent))); e1.appendChild(e2); element.appendChild(e1); } } @Nonnull @Override public Operator newInstance(@Nonnull Generic[] parameters) { return new IndefiniteIntegral(parameters); } @Nonnull @Override public Variable newInstance() { return new IndefiniteIntegral(null, null); } void bodyToMathML(MathML element) { Variable v = parameters[1].variableValue(); MathML e1 = element.element("mrow"); MathML e2 = element.element("mo"); e2.appendChild(element.text("\u222B")); e1.appendChild(e2); parameters[0].toMathML(e1, null); e2 = element.element("mo"); e2.appendChild(element.text(/*"\u2146"*/"d")); e1.appendChild(e2); v.toMathML(e1, null); element.appendChild(e1); } }