package org.geogebra.common.geogebra3D.kernel3D.commands; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.arithmetic.Command; import org.geogebra.common.kernel.commands.CmdPolygon; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.kernelND.GeoDirectionND; import org.geogebra.common.kernel.kernelND.GeoPointND; import org.geogebra.common.main.MyError; /** * Polygon[ <GeoPoint3D>, <GeoPoint3D>, ... ] or CmdPolygon */ public class CmdPolygon3D extends CmdPolygon { /** * constructor * * @param kernel * kernel */ public CmdPolygon3D(Kernel kernel) { super(kernel); } @Override protected GeoElement[] process(Command c, int n, GeoElement[] arg) throws MyError { if (n == 4) { // regular polygon with direction if (arg[0].isGeoPoint() && arg[1].isGeoPoint() && arg[2] instanceof GeoNumberValue && arg[3] instanceof GeoDirectionND) { return regularPolygon(c.getLabels(), (GeoPointND) arg[0], (GeoPointND) arg[1], (GeoNumberValue) arg[2], (GeoDirectionND) arg[3]); } } // use super method return super.process(c, n, arg); } @Override protected boolean checkIs3D(boolean is3D, GeoElement geo) { if (is3D) { return true; } return geo.isGeoElement3D(); } @Override protected GeoElement[] polygon(String[] labels, GeoPointND[] points, boolean is3D) { // if one point is 3D, use 3D algo if (is3D) { return kernelA.getManager3D().Polygon3D(labels, points); } // else use 2D algo return super.polygon(labels, points, is3D); } @Override protected GeoElement[] regularPolygon(String[] labels, GeoPointND A, GeoPointND B, GeoNumberValue n) { if (A.isGeoElement3D() || B.isGeoElement3D()) { return regularPolygon(labels, A, B, n, kernelA.getXOYPlane()); } return super.regularPolygon(labels, A, B, n); } private GeoElement[] regularPolygon(String[] labels, GeoPointND A, GeoPointND B, GeoNumberValue n, GeoDirectionND direction) { return kernelA.getManager3D().RegularPolygon(labels, A, B, n, direction); } }