package org.geogebra.common.kernel.commands; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.Transform; import org.geogebra.common.kernel.TransformRotate; import org.geogebra.common.kernel.advanced.AlgoRotateText; import org.geogebra.common.kernel.arithmetic.Command; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.geos.GeoText; import org.geogebra.common.kernel.kernelND.GeoPointND; import org.geogebra.common.main.MyError; /** * Rotate[ <GeoPoint>, <NumberValue> ] Rotate[ <GeoVector>, <NumberValue> ] * Rotate[ <GeoLine>, <NumberValue> ] Rotate[ <GeoConic>, <NumberValue> ] * Rotate[ <GeoPolygon>, <NumberValue> ] * * Rotate[ <GeoPoint>, <NumberValue>, <GeoPoint> ] Rotate[ <GeoLine>, * <NumberValue>, <GeoPoint> ] Rotate[ <GeoConic>, <NumberValue>, <GeoPoint> ] * Rotate[ <GeoPolygon>, <NumberValue>, <GeoPoint> ] */ public class CmdRotate extends CommandProcessor { /** * Create new command processor * * @param kernel * kernel */ public CmdRotate(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) { case 2: // ROTATE AROUND CENTER (0,0) arg = resArgs(c); return process2(c, arg, ok); case 3: // ROTATION AROUND POINT arg = resArgs(c); return process3(c, arg, ok); default: throw argNumErr(app, c, n); } } /** * process for 2 args * * @param c * command * @param arg * args * @param ok * is that ok ? * @return geos */ final protected GeoElement[] process2(Command c, GeoElement[] arg, boolean[] ok) { if (arg[1] instanceof GeoNumberValue) { if (arg[0] instanceof GeoText) { // c.setName("RotateText"); // return kernelA.getAlgebraProcessor().processCommand(c, // new EvalInfo(false)); AlgoRotateText algo = new AlgoRotateText(cons, c.getLabel(), (GeoText) arg[0], (GeoNumberValue) arg[1]); return new GeoElement[] { algo.getResult() }; } GeoNumberValue phi = (GeoNumberValue) arg[1]; return Rotate(c.getLabel(), arg[0], phi); } throw argErr(app, c, arg[0]); } /** * process for 3 args * * @param c * command * @param arg * args * @param ok * is that ok ? * @return geos */ final protected GeoElement[] process3(Command c, GeoElement[] arg, boolean[] ok) { if ((ok[0] = true) && (ok[1] = (arg[1] instanceof GeoNumberValue)) && (ok[2] = (arg[2].isGeoPoint()))) { if (arg[0] instanceof GeoText) { c.setName("RotateText"); return kernelA.getAlgebraProcessor().processCommand(c, new EvalInfo(false)); } GeoNumberValue phi = (GeoNumberValue) arg[1]; GeoPointND Q = (GeoPointND) arg[2]; return getAlgoDispatcher().Rotate(c.getLabel(), arg[0], phi, Q); } throw argErr(app, c, getBadArg(ok, arg)); } /** * rotate geoRot by angle phi around (0,0) */ final private GeoElement[] Rotate(String label, GeoElement geoRot, GeoNumberValue phi) { Transform t = new TransformRotate(cons, phi); return t.transform(geoRot, label); } }