package org.geogebra.common.geogebra3D.euclidian3D.draw; import java.util.ArrayList; import org.geogebra.common.geogebra3D.euclidian3D.EuclidianView3D; import org.geogebra.common.geogebra3D.kernel3D.geos.GeoRay3D; 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; import org.geogebra.common.kernel.kernelND.GeoRayND; /** * Class for drawing a 3D ray. * * @author matthieu * */ public class DrawRay3D extends DrawCoordSys1D { /** * common constructor * * @param a_view * @param ray */ public DrawRay3D(EuclidianView3D a_view, GeoRayND ray) { super(a_view, (GeoElement) ray); } @Override protected boolean updateForItSelf() { updateForItSelf(true); return true; } /** * update when the element is modified * * @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 = (GeoLineND) getGeoElement(); Coords o = line.getPointInD(3, 0).getInhomCoordsInSameDimension(); Coords v = line.getPointInD(3, 1).getInhomCoordsInSameDimension() .sub(o); double[] minmax = getView3D().getIntervalClippedLarge( new double[] { 0, 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 previable * * @param a_view3D * @param selectedPoints */ public DrawRay3D(EuclidianView3D a_view3D, ArrayList<GeoPointND> selectedPoints) { super(a_view3D, selectedPoints, new GeoRay3D(a_view3D.getKernel().getConstruction())); } }