package org.geogebra.common.geogebra3D.euclidian3D.draw;
import org.geogebra.common.geogebra3D.euclidian3D.EuclidianView3D;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoQuadric3D;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoQuadric3DPart;
import org.geogebra.common.kernel.geos.FromMeta;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.kernelND.GeoQuadricNDConstants;
import org.geogebra.common.main.Feature;
/**
* draws a quadric part
*
* @author mathieu
*
*/
public class DrawQuadric3DPart extends DrawQuadric3D {
public DrawQuadric3DPart(EuclidianView3D view, GeoQuadric3DPart quadric) {
super(view, quadric);
}
@Override
protected double[] getMinMax() {
GeoQuadric3DPart quadric = (GeoQuadric3DPart) getGeoElement();
return new double[] { quadric.getMinParameter(1),
quadric.getMaxParameter(1) };
}
@Override
protected void updateForView() {
GeoQuadric3D quadric = (GeoQuadric3D) getGeoElement();
switch (quadric.getType()) {
default:
// do nothing
break;
case GeoQuadricNDConstants.QUADRIC_HYPERBOLIC_CYLINDER:
case GeoQuadricNDConstants.QUADRIC_PARABOLIC_CYLINDER:
if (getView3D().viewChangedByZoom()) {
updateForItSelf();
}
break;
case GeoQuadricNDConstants.QUADRIC_CONE:
if (getView3D().getApplication()
.has(Feature.DIFFERENT_AXIS_RATIO_3D)) {
updateForItSelf();
}
break;
case GeoQuadricNDConstants.QUADRIC_CYLINDER:
if (getView3D().viewChangedByZoom()) {
if (getView3D().getApplication()
.has(Feature.DIFFERENT_AXIS_RATIO_3D)) {
updateForItSelf();
} else {
int l = getView3D().getRenderer().getGeometryManager()
.getLongitude(quadric.getHalfAxis(0),
getView3D().getScale());
if (longitude != l) {
updateForItSelf();
}
}
}
break;
}
}
@Override
public boolean doHighlighting() {
// if it depends on a limited quadric, look at the meta' highlighting
if (getGeoElement().getMetasLength() > 0) {
for (GeoElement meta : ((FromMeta) getGeoElement()).getMetas()) {
if (meta != null && meta.doHighlighting()) {
return true;
}
}
}
return super.doHighlighting();
}
}