package org.geogebra.common.kernel.commands;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoPolygon3D;
import org.geogebra.common.kernel.CircularDefinitionException;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.arithmetic.Command;
import org.geogebra.common.kernel.geos.GeoBoolean;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoPolygon;
import org.geogebra.common.main.MyError;
/**
* Difference[<polygon>,<polygon>]
*
* @author thilina
*
*/
public class CmdDifference extends CommandProcessor {
/**
*
* @param kernel
* kernel
*/
public CmdDifference(Kernel kernel) {
super(kernel);
}
@Override
public GeoElement[] process(Command c)
throws MyError, CircularDefinitionException {
int argumentNo = c.getArgumentNumber();
boolean[] ok = { false, false, false };
GeoElement[] arg = resArgs(c);
switch (argumentNo) {
case 2:
if ((ok[0] = arg[0] instanceof GeoPolygon)
&& (ok[1] = arg[1] instanceof GeoPolygon)) {
if (arg[0] instanceof GeoPolygon3D
&& arg[1] instanceof GeoPolygon3D) {
return difference3D(c.getLabels(), (GeoPolygon3D) arg[0],
(GeoPolygon3D) arg[1]);
}
return difference(c.getLabels(), (GeoPolygon) arg[0],
(GeoPolygon) arg[1]);
}
throw argErr(app, c, getBadArg(ok, arg));
case 3:
if ((ok[0] = arg[0] instanceof GeoPolygon)
&& (ok[1] = arg[1] instanceof GeoPolygon)
&& (ok[2] = arg[2] instanceof GeoBoolean)) {
if (arg[0] instanceof GeoPolygon3D
&& arg[1] instanceof GeoPolygon3D) {
return difference3D(c.getLabels(), (GeoPolygon3D) arg[0],
(GeoPolygon3D) arg[1], (GeoBoolean) arg[2]);
}
return difference(c.getLabels(), (GeoPolygon) arg[0],
(GeoPolygon) arg[1], (GeoBoolean) arg[2]);
}
throw argErr(app, c, getBadArg(ok, arg));
default:
throw argNumErr(app, c, argumentNo);
}
}
/**
* returns the output polygon after polygon difference operation
*
* @param labels
* labels for output
* @param poly1
* input polygon 1
* @param poly2
* input polygon 2
* @return resulting polygons
*/
protected GeoElement[] difference(String[] labels, GeoPolygon poly1,
GeoPolygon poly2) {
return getAlgoDispatcher().Difference(labels, poly1, poly2);
}
/**
* returns the output polygon after polygon difference operation
*
* @param labels
* labels for output
* @param poly1
* input polygon3D 1
* @param poly2
* input polygon3D 2
* @return resulting polygons
*/
protected GeoElement[] difference3D(String[] labels, GeoPolygon3D poly1,
GeoPolygon3D poly2) {
return kernelA.getManager3D().DifferencePolygons(labels, poly1, poly2);
}
/**
* returns the output polygon after polygon exclusive OR/difference (XOR)
* operation
*
* @param labels
* labels for output
* @param poly1
* input polygon 1
* @param poly2
* input polygon 2
* @param exclusive
* input GeoBoolean indicating XOR or not
* @return resulting polygons
*/
protected GeoElement[] difference(String[] labels, GeoPolygon poly1,
GeoPolygon poly2, GeoBoolean exclusive) {
return getAlgoDispatcher().Difference(labels, poly1, poly2, exclusive);
}
/**
* returns the output polygon after polygon exclusive OR/difference (XOR)
* operation
*
* @param labels
* labels for output
* @param poly1
* input polygon3D 1
* @param poly2
* input polygon3D 2
* @param exclusive
* input GeoBoolean indicating exclusive difference or not
* @return resulting polygons
*/
protected GeoElement[] difference3D(String[] labels, GeoPolygon3D poly1,
GeoPolygon3D poly2, GeoBoolean exclusive) {
return kernelA.getManager3D().DifferencePolygons(labels, poly1, poly2,
exclusive);
}
}