package org.geogebra.common.geogebra3D.euclidian3D.draw;
import org.geogebra.common.geogebra3D.euclidian3D.EuclidianView3D;
import org.geogebra.common.geogebra3D.euclidian3D.openGL.PlotterBrush;
import org.geogebra.common.geogebra3D.euclidian3D.openGL.PlotterSurface;
import org.geogebra.common.kernel.kernelND.GeoConicND;
import org.geogebra.common.kernel.kernelND.GeoConicNDConstants;
import org.geogebra.common.kernel.kernelND.GeoConicPartND;
public class DrawConicPart3D extends DrawConic3D {
public DrawConicPart3D(EuclidianView3D view3d, GeoConicPartND conic) {
super(view3d, (GeoConicND) conic);
}
@Override
protected double getEllipseSurfaceStart() {
// return 0;
return ((GeoConicPartND) getGeoElement()).getParameterStart();
}
@Override
protected double getEllipseSurfaceExtent() {
return ((GeoConicPartND) getGeoElement()).getParameterExtent();
}
@Override
protected void updateCircle(PlotterBrush brush) {
double start = getEllipseSurfaceStart();
double extent = getEllipseSurfaceExtent();
brush.arc(m, ev1, ev2, e1, start, extent, longitude);
updateSectorSegments(brush, start, start + extent);
}
@Override
protected void updateEllipse(PlotterBrush brush) {
double start = getEllipseSurfaceStart();
double extent = getEllipseSurfaceExtent();
brush.arcEllipse(m, ev1, ev2, e1, e2, start, extent);
updateSectorSegments(brush, start, start + extent);
}
private void updateSectorSegments(PlotterBrush brush, double start,
double end) {
// if sector draws segments
if (((GeoConicPartND) getGeoElement())
.getConicPartType() == GeoConicNDConstants.CONIC_PART_SECTOR) {
brush.setAffineTexture(0.5f, 0.25f);
brush.segment(m, m.add(ev1.mul(e1 * Math.cos(start)))
.add(ev2.mul(e2 * Math.sin(start))));
brush.segment(m, m.add(ev1.mul(e1 * Math.cos(end)))
.add(ev2.mul(e2 * Math.sin(end))));
}
}
@Override
protected void updateLines(PlotterBrush brush) {
if (((GeoConicPartND) conic).positiveOrientation()) {
brush.segment(conic.getOrigin3D(0),
((GeoConicPartND) conic).getSegmentEnd3D());
} else {
m = conic.getOrigin3D(0);
d = ((GeoConicPartND) conic).getSegmentEnd3D().sub(m);
minmax = getLineMinMax(0); // get min/max with current (m,d)
brush.segment(m, m.add(d.mul(minmax[0])));
brush.segment(((GeoConicPartND) conic).getSegmentEnd3D(),
m.add(d.mul(minmax[1])));
}
}
@Override
protected void updateParallelLines(PlotterSurface surface) {
// no surface here
}
@Override
protected void updateSinglePoint(PlotterSurface surface) {
// not visible
setGeometryIndex(-1);
}
@Override
protected boolean isSector() {
return ((GeoConicPartND) conic)
.getConicPartType() == GeoConicNDConstants.CONIC_PART_SECTOR;
}
}