package org.geogebra.common.geogebra3D.euclidianForPlane; import java.util.ArrayList; import org.geogebra.common.euclidian.EuclidianController; import org.geogebra.common.euclidian.event.AbstractEvent; import org.geogebra.common.geogebra3D.euclidianFor3D.EuclidianControllerFor3DCompanion; import org.geogebra.common.geogebra3D.kernel3D.geos.GeoPoint3D; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.Path; import org.geogebra.common.kernel.Region; import org.geogebra.common.kernel.Matrix.Coords; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.kernelND.GeoConicND; import org.geogebra.common.kernel.kernelND.GeoPointND; /** * controller creator for view from plane * * @author mathieu * */ public class EuclidianControllerForPlaneCompanion extends EuclidianControllerFor3DCompanion { /** * @param ec * euclidian controller */ public EuclidianControllerForPlaneCompanion(EuclidianController ec) { super(ec); } @Override protected GeoElement[] createCircle2(GeoPointND p0, GeoPointND p1) { return createCircle2For3D(p0, p1); } @Override protected GeoConicND circle(Construction cons, GeoPointND center, GeoNumberValue radius) { return circleFor3D(cons, center, radius); } @Override public GeoPointND getSingleIntersectionPoint(GeoElement a, GeoElement b, boolean coords2D) { return super.getSingleIntersectionPoint(a, b, false); } private Coords getCoordsFromView(double x, double y) { Coords c = new Coords(4); ec.getView().getCompanion().getCoordsFromView(x, y, c); return c; } @Override public void movePoint(boolean repaint, AbstractEvent event) { Coords coords = getCoordsFromView(ec.xRW, ec.yRW); // Application.debug("xRW, yRW= "+xRW+", "+yRW+"\n3D coords:\n"+coords); // cancel 3D controller stuff if (((GeoElement) ec.movedGeoPoint).isGeoElement3D()) { ((GeoPoint3D) ec.movedGeoPoint).setWillingCoordsUndefined(); ((GeoPoint3D) ec.movedGeoPoint).setWillingDirectionUndefined(); } ec.movedGeoPoint.setCoords(coords, true); ((GeoElement) ec.movedGeoPoint).updateCascade(); if (repaint) { ec.kernel.notifyRepaint(); } } @Override protected GeoPointND createNewPoint(boolean forPreviewable, boolean complex) { Coords coords = getCoordsFromView(ec.xRW, ec.yRW); GeoPointND ret = ec.kernel.getManager3D().Point3DIn(null, ec.getView().getPlaneContaining(), coords, !forPreviewable, false); return ret; } @Override protected GeoPointND createNewPoint(boolean forPreviewable, Path path, boolean complex) { Coords coords = getCoordsFromView(ec.xRW, ec.yRW); return createNewPoint(null, forPreviewable, path, coords.getX(), coords.getY(), coords.getZ(), complex, false); } @Override protected GeoPointND createNewPoint(boolean forPreviewable, Region region, boolean complex) { Coords coords = getCoordsFromView(ec.xRW, ec.yRW); return ec.createNewPoint(null, forPreviewable, region, coords.getX(), coords.getY(), coords.getZ(), complex, false); } @Override protected void processModeLock(GeoPointND point) { Coords coords = ec.getView().getCoordsForView( point.getInhomCoordsInD3()); ec.xRW = coords.getX(); ec.yRW = coords.getY(); } @Override protected void processModeLock(Path path) { GeoPointND p = createNewPoint(true, path, false); ((GeoElement) p).update(); Coords coords = ec.getView().getCoordsForView(p.getInhomCoordsInD3()); ec.xRW = coords.getX(); ec.yRW = coords.getY(); } @Override public ArrayList<GeoElement> removeParentsOfView( ArrayList<GeoElement> list) { ArrayList<GeoElement> ret = new ArrayList<GeoElement>(); for (GeoElement geo : list) { if (ec.getView().isMoveable(geo)) { ret.add(geo); } } return ret; } @Override public boolean viewOrientationForClockwise(boolean clockwise) { return ((EuclidianViewForPlaneCompanion) ec.getView().getCompanion()) .viewOrientationForClockwise(clockwise); } @Override public GeoElement[] rotateByAngle(GeoElement geoRot, GeoNumberValue phi, GeoPointND Q) { return ec.kernel.getManager3D().Rotate3D(null, geoRot, phi, Q, ec.getView().getDirection()); } @Override public boolean setCoordsToMouseLoc(GeoPointND loc) { loc.setCoords(ec.mouseLoc.x, ec.mouseLoc.y, 1.0); return false; } }