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.CmdLineBisector; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.kernelND.GeoDirectionND; import org.geogebra.common.kernel.kernelND.GeoPointND; import org.geogebra.common.kernel.kernelND.GeoSegmentND; import org.geogebra.common.main.MyError; /** * Line bisector * */ public class CmdLineBisector3D extends CmdLineBisector { /** * @param kernel * Kernel */ public CmdLineBisector3D(Kernel kernel) { super(kernel); } @Override protected GeoElement[] process2(Command c, GeoElement[] arg, boolean[] ok) throws MyError { // line through point orthogonal to vector if ((ok[0] = (arg[0].isGeoSegment())) && (ok[1] = (arg[1] instanceof GeoDirectionND))) { GeoElement[] ret = { kernelA.getManager3D().LineBisector3D(c.getLabel(), (GeoSegmentND) arg[0], (GeoDirectionND) arg[1]) }; return ret; } return super.process2(c, arg, ok); } @Override protected GeoElement lineBisector(String label, GeoSegmentND segment) { GeoDirectionND orientation = CommandProcessor3D .getCurrentViewOrientation(kernelA, app); if (orientation == null) { if (segment.isGeoElement3D()) { orientation = kernelA.getXOYPlane(); } else { // use 2D algo return super.lineBisector(label, segment); } } return kernelA.getManager3D().LineBisector3D(label, segment, orientation); } @Override protected GeoElement lineBisector(String label, GeoPointND a, GeoPointND b) { GeoDirectionND orientation = CommandProcessor3D .getCurrentViewOrientation(kernelA, app); if (orientation == null) { if (a.isGeoElement3D() || b.isGeoElement3D()) { orientation = kernelA.getXOYPlane(); } else { // use 2D algo return super.lineBisector(label, a, b); } } return kernelA.getManager3D().LineBisector3D(label, a, b, orientation); } @Override protected GeoElement[] process3(Command c, GeoElement[] arg, boolean[] ok) throws MyError { if ((ok[0] = (arg[0].isGeoPoint())) && (ok[1] = (arg[1].isGeoPoint())) && (ok[2] = (arg[2] instanceof GeoDirectionND))) { GeoElement[] ret = { kernelA.getManager3D().LineBisector3D( c.getLabel(), (GeoPointND) arg[0], (GeoPointND) arg[1], (GeoDirectionND) arg[2]) }; return ret; } return null; } }