package org.geogebra.common.kernel.commands;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.algos.AlgoDrawingPadCorner;
import org.geogebra.common.kernel.algos.AlgoImageCorner;
import org.geogebra.common.kernel.algos.AlgoTextCorner;
import org.geogebra.common.kernel.algos.AlgoVertexConic;
import org.geogebra.common.kernel.algos.AlgoVertexIneq;
import org.geogebra.common.kernel.algos.AlgoVertexPolygon;
import org.geogebra.common.kernel.algos.AlgoVertexSegment;
import org.geogebra.common.kernel.arithmetic.Command;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoFunctionNVar;
import org.geogebra.common.kernel.geos.GeoImage;
import org.geogebra.common.kernel.geos.GeoNumberValue;
import org.geogebra.common.kernel.geos.GeoPoly;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.kernel.kernelND.GeoConicND;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.kernel.kernelND.GeoSegmentND;
import org.geogebra.common.main.MyError;
/**
* Vertex[ <GeoConic> ]
*/
public class CmdVertex extends CommandProcessor {
/**
* Create new command processor
*
* @param kernel
* kernel
*/
public CmdVertex(Kernel kernel) {
super(kernel);
}
@Override
public GeoElement[] process(Command c) throws MyError {
int n = c.getArgumentNumber();
boolean[] ok = new boolean[n];
GeoElement[] arg;
switch (n) {
// Vertex[ <GeoConic> ]
case 1:
arg = resArgs(c);
if (arg[0].isGeoConic()) {
AlgoVertexConic algo = newAlgoVertexConic(cons, c.getLabels(),
(GeoConicND) arg[0]);
return (GeoElement[]) algo.getVertex();
}
if (arg[0] instanceof GeoPoly) {
AlgoVertexPolygon algo = kernelA.getAlgoDispatcher()
.newAlgoVertexPolygon(cons, c.getLabels(),
(GeoPoly) arg[0]);
return algo.getVertex();
}
if (arg[0] instanceof GeoFunctionNVar) {
AlgoVertexIneq algo = new AlgoVertexIneq(cons, c.getLabels(),
(GeoFunctionNVar) arg[0]);
return algo.getVertex();
} else if (arg[0] instanceof GeoNumberValue) {
GeoElement[] ret = {
(GeoElement) cornerOfDrawingPad(c.getLabel(),
(GeoNumberValue) arg[0], null) };
return ret;
} else {
throw argErr(app, c, arg[0]);
}
// Corner[ <Image>, <number> ]
case 2:
arg = resArgs(c);
if ((ok[0] = (arg[0] instanceof GeoPoly))
&& (ok[1] = (arg[1] instanceof GeoNumberValue))) {
AlgoVertexPolygon algo = newAlgoVertexPolygon(cons,
c.getLabel(), (GeoPoly) arg[0],
(GeoNumberValue) arg[1]);
GeoElement[] ret = { (GeoElement) algo.getOneVertex() };
return ret;
} else if ((ok[0] = (arg[0].isGeoImage()))
&& (ok[1] = (arg[1] instanceof GeoNumberValue))) {
AlgoImageCorner algo = new AlgoImageCorner(cons, c.getLabel(),
(GeoImage) arg[0], (GeoNumberValue) arg[1]);
GeoElement[] ret = { algo.getCorner() };
return ret;
}
// Corner[ <Text>, <number> ]
else if ((ok[0] = (arg[0].isGeoText()))
&& (ok[1] = (arg[1] instanceof GeoNumberValue))) {
AlgoTextCorner algo = new AlgoTextCorner(cons, c.getLabel(),
(GeoText) arg[0], (GeoNumberValue) arg[1]);
GeoElement[] ret = { algo.getCorner() };
return ret;
} else if ((ok[0] = (arg[0].isGeoSegment()))
&& (ok[1] = (arg[1] instanceof GeoNumberValue))) {
GeoSegmentND segment = (GeoSegmentND) arg[0];
GeoElement P = (GeoElement) segment.getStartPoint();
GeoElement Q = (GeoElement) segment.getEndPoint();
// P and Q should either be both 2D or both 3D
if (P.getGeoClassType().equals(Q.getGeoClassType())) {
AlgoVertexSegment algo = new AlgoVertexSegment(cons,
c.getLabel(), (GeoSegmentND) arg[0],
(GeoNumberValue) arg[1]);
GeoElement[] ret = { (GeoElement) algo.getPoint() };
return ret;
}
throw argErr(app, c, arg[0]);
} else if ((ok[0] = (arg[0] instanceof GeoNumberValue))
&& (ok[1] = (arg[1] instanceof GeoNumberValue))) {
GeoElement[] ret = {
(GeoElement) cornerOfDrawingPad(c.getLabel(),
(GeoNumberValue) arg[1],
(GeoNumberValue) arg[0]) };
return ret;
} else {
throw argErr(app, c, getBadArg(ok, arg));
}
default:
throw argNumErr(app, c, n);
}
}
/**
* Corner of Drawing Pad Michael Borcherds 2008-05-10
*
* @param label
* label
* @param number
* corner index
* @param ev
* view index
* @return view corner
*/
protected GeoPointND cornerOfDrawingPad(String label, GeoNumberValue number,
GeoNumberValue ev) {
AlgoDrawingPadCorner algo = new AlgoDrawingPadCorner(cons, label,
number, ev);
return algo.getCorner();
}
/**
* @param cons1
* construction
* @param label
* output label
* @param p
* polygon
* @param v
* vertex index
* @return algo for one of the corners of a polygon/polyline
*/
protected AlgoVertexPolygon newAlgoVertexPolygon(Construction cons1,
String label, GeoPoly p, GeoNumberValue v) {
return new AlgoVertexPolygon(cons1, label, p, v);
}
/**
* @param cons1
* construction
* @param labels
* output labels
* @param conic
* conic
* @return algo for "corners" of a conic
*/
protected AlgoVertexConic newAlgoVertexConic(Construction cons1,
String[] labels, GeoConicND conic) {
return new AlgoVertexConic(cons1, labels, conic);
}
}