package org.geogebra.common.kernel.advanced;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.algos.AlgoElement;
import org.geogebra.common.kernel.arithmetic.MyDouble;
import org.geogebra.common.kernel.commands.Commands;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoList;
import org.geogebra.common.kernel.geos.GeoNumberValue;
import org.geogebra.common.kernel.geos.GeoNumeric;
public class AlgoDivision extends AlgoElement {
private GeoNumberValue a, b;
private GeoNumeric num, mod;
private GeoList result;
public AlgoDivision(Construction cons, String label,
GeoNumberValue dividend, GeoNumberValue divisor) {
super(cons);
a = dividend;
b = divisor;
num = new GeoNumeric(cons);
mod = new GeoNumeric(cons);
result = new GeoList(cons);
result.add(num);
result.add(mod);
setInputOutput();
compute();
result.setLabel(label);
}
@Override
protected void setInputOutput() {
setOnlyOutput(result);
input = new GeoElement[] { a.toGeoElement(), b.toGeoElement() };
setDependencies();
}
@Override
public void compute() {
if (input[0].isDefined() && input[1].isDefined()) {
double numerator = a.getDouble();
double denominator = b.getDouble();
if (Math.abs(numerator) > MyDouble.LARGEST_INTEGER
|| Math.abs(denominator) > MyDouble.LARGEST_INTEGER) {
result.setUndefined();
return;
}
result.setDefined(true);
double m = numerator % Math.abs(denominator);
if (m < 0) {
m += Math.abs(denominator);
}
mod.setValue(m);
num.setValue(Math.round((numerator - m) / denominator));
} else {
result.setUndefined();
}
}
@Override
public Commands getClassName() {
return Commands.Division;
}
public GeoElement getResult() {
return result;
}
}