package org.geogebra.common.geogebra3D.euclidian3D.draw;
import java.util.ArrayList;
import org.geogebra.common.geogebra3D.euclidian3D.EuclidianView3D;
import org.geogebra.common.geogebra3D.euclidian3D.openGL.PlotterBrush;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoSegment3D;
import org.geogebra.common.kernel.Matrix.Coords;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.kernelND.GeoPointND;
import org.geogebra.common.kernel.kernelND.GeoSegmentND;
/**
* Class for drawing segments
*
* @author matthieu
*
*/
public class DrawSegment3D extends DrawCoordSys1D {
/**
* Common constructor
*
* @param a_view3D
* view
* @param segment
* segment
*/
public DrawSegment3D(EuclidianView3D a_view3D, GeoSegmentND segment) {
super(a_view3D, (GeoElement) segment);
setDrawMinMax(0, 1);
}
@Override
public boolean doHighlighting() {
// if the segments depends on a polygon (or polyhedron), look at the
// poly' highlighting
GeoElement meta = ((GeoSegmentND) getGeoElement()).getMetas()[0];
if (meta != null && meta.doHighlighting()) {
return true;
}
return super.doHighlighting();
}
@Override
protected void updateForView() {
if (getView3D().viewChangedByZoom()) {
updateForItSelf();
}
}
// //////////////////////////////
// Previewable interface
/**
* Constructor for previewable
*
* @param a_view3D
* view
* @param selectedPoints
* endpoints
*/
public DrawSegment3D(EuclidianView3D a_view3D,
ArrayList<GeoPointND> selectedPoints) {
super(a_view3D, selectedPoints,
new GeoSegment3D(a_view3D.getKernel().getConstruction()));
setDrawMinMax(0, 1);
}
@Override
protected Coords[] calcPoints() {
GeoSegmentND seg = (GeoSegmentND) getGeoElement();
return new Coords[] { seg.getStartInhomCoords(),
seg.getEndInhomCoords() };
}
private Coords boundsMin = new Coords(3), boundsMax = new Coords(3);
@Override
protected void setStartEndPoints(Coords p1, Coords p2) {
super.setStartEndPoints(p1, p2);
double radius = getLineThickness() * PlotterBrush.LINE3D_THICKNESS
/ getView3D().getScale();
for (int i = 1; i <= 3; i++) {
if (p1.get(i) < p2.get(i)) {
boundsMin.set(i, p1.get(i) - radius);
boundsMax.set(i, p2.get(i) + radius);
} else {
boundsMin.set(i, p2.get(i) - radius);
boundsMax.set(i, p1.get(i) + radius);
}
}
}
@Override
public void enlargeBounds(Coords min, Coords max) {
enlargeBounds(min, max, boundsMin, boundsMax);
}
}