package org.geogebra.common.kernel.commands; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.algos.AlgoRandomPoint; import org.geogebra.common.kernel.algos.AlgoRandomPointInConic; import org.geogebra.common.kernel.algos.AlgoRandomPointInPoints; import org.geogebra.common.kernel.algos.AlgoRandomPointInPolygon; 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.GeoPolygon; import org.geogebra.common.kernel.kernelND.GeoConicND; import org.geogebra.common.kernel.kernelND.GeoPointND; import org.geogebra.common.main.MyError; /** * Processor for random points * */ public class CmdRandomPointIn extends CommandProcessor { /** * @param kernel * kernel */ public CmdRandomPointIn(Kernel kernel) { super(kernel); } @Override public GeoElement[] process(Command c) throws MyError { int n = c.getArgumentNumber(); GeoElement[] arg = resArgs(c); if (n == 1) { if (arg[0].isGeoPolygon()) { AlgoRandomPointInPolygon algo = new AlgoRandomPointInPolygon( cons, c.getLabel(), (GeoPolygon) arg[0]); GeoElement[] ret = { algo.getRandomPoint() }; return ret; } else if (arg[0].isGeoConic()) { AlgoRandomPointInConic algo = new AlgoRandomPointInConic(cons, c.getLabel(), (GeoConicND) arg[0]); GeoElement[] ret = { algo.getRandomPoint() }; return ret; } else { throw argErr(app, c, arg[0]); } } else if (n == 4 && arg[0].isNumberValue() && arg[1].isNumberValue() && arg[2].isNumberValue() && arg[3].isNumberValue()) { return randomPoint(c.getLabel(), (GeoNumberValue) arg[0], (GeoNumberValue) arg[1], (GeoNumberValue) arg[2], (GeoNumberValue) arg[3]); } else if (n > 2) { arg = resArgs(c); GeoPointND[] points = new GeoPointND[n]; // check arguments for (int i = 0; i < n; i++) { if (!(arg[i].isGeoPoint())) { throw argErr(app, c, arg[i]); } points[i] = (GeoPointND) arg[i]; } // everything ok AlgoRandomPointInPoints algo = new AlgoRandomPointInPoints(cons, c.getLabel(), points); GeoElement[] ret = { algo.getRandomPoint() }; return ret; } else { throw argNumErr(app, c, n); } } /** * @param label * label * @param a * x-min * @param b * x-max * @param c * y-min * @param d * y-max * @return random point (p,q) where p is between a & b and q is between c & * d */ protected GeoElement[] randomPoint(String label, GeoNumberValue a, GeoNumberValue b, GeoNumberValue c, GeoNumberValue d) { AlgoRandomPoint arp = new AlgoRandomPoint(cons, label, a, b, c, d); return new GeoElement[] { arp.getOutput(0) }; } }