package org.geogebra.common.geogebra3D.euclidianFor3D;
import org.geogebra.common.awt.GAffineTransform;
import org.geogebra.common.euclidian.DrawableND;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.euclidian.EuclidianViewCompanion;
import org.geogebra.common.euclidian.draw.DrawParametricCurve;
import org.geogebra.common.factories.AwtFactory;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoCurveCartesian3D;
import org.geogebra.common.kernel.Matrix.Coords;
import org.geogebra.common.kernel.geos.GeoAngle;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.kernelND.GeoConicND;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.util.debug.Log;
/**
* companion for view for 3D
*
* @author mathieu
*
*/
public class EuclidianViewFor3DCompanion extends EuclidianViewCompanion {
/**
* constructor
*
* @param view
* view attached
*/
public EuclidianViewFor3DCompanion(EuclidianView view) {
super(view);
}
@Override
public DrawableND newDrawable(GeoElement geo) {
// first try super method
DrawableND d = super.newDrawable(geo);
if (d != null) {
return d;
}
// try 3D geos
switch (geo.getGeoClassType()) {
default:
Log.debug("missing case " + geo.getGeoClassType());
break;
case ANGLE3D:
d = new DrawAngleFor3D(view, (GeoAngle) geo);
break;
case CURVE_CARTESIAN3D:
d = newDrawParametricCurve((GeoCurveCartesian3D) geo);
break;
}
return d;
}
/**
*
* @param geo
* curve
* @return drawable for curve
*/
protected DrawableND newDrawParametricCurve(GeoCurveCartesian3D geo) {
return new DrawParametricCurve(view, new CurveEvaluableFor3D(geo));
}
@Override
public GAffineTransform getTransform(GeoConicND conic, Coords M,
Coords[] ev) {
// use already computed for this view middlepoint M and eigen vecs ev
GAffineTransform transform = AwtFactory.getPrototype()
.newAffineTransform();
transform.setTransform(ev[0].getX(), ev[0].getY(), ev[1].getX(),
ev[1].getY(), M.getX(), M.getY());
return transform;
}
@Override
public Coords getCoordsForView(GeoPointND point) {
return view.getCoordsForView(point.getInhomCoordsInD3());
}
@Override
public void getXMLid(StringBuilder sbxml) {
getXMLidNoCheck(sbxml);
}
}