package org.geogebra.common.geogebra3D.euclidian3D.draw; import java.util.ArrayList; import org.geogebra.common.euclidian.Previewable; import org.geogebra.common.geogebra3D.euclidian3D.EuclidianView3D; import org.geogebra.common.geogebra3D.kernel3D.geos.GeoLine3D; import org.geogebra.common.kernel.Matrix.Coords; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.kernelND.GeoLineND; import org.geogebra.common.kernel.kernelND.GeoPointND; /** * Class for drawing lines * * @author matthieu * */ public class DrawLine3D extends DrawCoordSys1D implements Previewable { /** * common constructor * * @param a_view3D * @param line */ public DrawLine3D(EuclidianView3D a_view3D, GeoLineND line) { this(a_view3D, line, null); } /** * Constructor for helpers * * @param a_view3D * @param line * @param geo2 */ public DrawLine3D(EuclidianView3D a_view3D, GeoLineND line, GeoElement geo2) { super(a_view3D); init((GeoElement) line, geo2); } /** * @param line * line * @param geo2 * geo caller */ protected void init(GeoElement line, GeoElement geo2) { super.init(line); } @Override protected boolean updateForItSelf() { updateForItSelf(true); return true; } /** * update the drawable when the element changes * * @param updateDrawMinMax * update min and max values */ protected void updateForItSelf(boolean updateDrawMinMax) { if (updateDrawMinMax) { updateDrawMinMax(); } super.updateForItSelf(); } /** * update min and max values */ protected void updateDrawMinMax() { GeoLineND line = getLine(); Coords o = line.getPointInD(3, 0).getInhomCoordsInSameDimension(); Coords v = line.getPointInD(3, 1).getInhomCoordsInSameDimension() .sub(o); double[] minmax = getView3D().getIntervalClippedLarge(new double[] { Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY }, o, v); setDrawMinMax(minmax[0], minmax[1]); } @Override protected void updateForView() { if (getView3D().viewChangedByZoom() || getView3D().viewChangedByTranslate()) { updateForItSelf(); } } private Coords boundsMin = new Coords(3), boundsMax = new Coords(3); @Override protected void setStartEndPoints(Coords p1, Coords p2) { super.setStartEndPoints(p1, p2); double[] minmax = getDrawMinMax(); if (minmax[0] > minmax[1]) { // line is not visible boundsMin.setX(Double.NaN); return; } for (int i = 1; i <= 3; i++) { if (p1.get(i) < p2.get(i)) { boundsMin.set(i, p1.get(i)); boundsMax.set(i, p2.get(i)); } else { boundsMin.set(i, p2.get(i)); boundsMax.set(i, p1.get(i)); } } } @Override public void enlargeBounds(Coords min, Coords max) { if (!Double.isNaN(boundsMin.getX())) { enlargeBounds(min, max, boundsMin, boundsMax); } } // ////////////////////////////// // Previewable interface /** * constructor for previewable * * @param a_view3D * @param selectedPoints */ public DrawLine3D(EuclidianView3D a_view3D, ArrayList<GeoPointND> selectedPoints) { super(a_view3D, selectedPoints, new GeoLine3D(a_view3D.getKernel().getConstruction())); } }