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.GeoVector3D;
import org.geogebra.common.kernel.CircularDefinitionException;
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.GeoVectorND;
/**
* Class for drawing vectors
*
* @author matthieu
*
*/
public class DrawVector3D extends DrawJoinPoints {
/**
* Common constructor
*
* @param view3D
* @param vector
*/
public DrawVector3D(EuclidianView3D view3D, GeoVectorND vector) {
super(view3D, (GeoElement) vector);
setDrawMinMax(0, 1);
}
@Override
protected void setArrowTypeBefore(PlotterBrush brush) {
brush.setArrowType(PlotterBrush.ARROW_TYPE_SIMPLE);
}
@Override
protected void setArrowTypeAfter(PlotterBrush brush) {
brush.setArrowType(PlotterBrush.ARROW_TYPE_NONE);
}
@Override
protected void updateForView() {
if (getView3D().viewChangedByZoom()) {
updateForItSelf();
}
}
// //////////////////////////////
// Previewable interface
/**
* constructor for previewable
*
* @param view3D
* @param selectedPoints
*/
public DrawVector3D(EuclidianView3D view3D,
ArrayList<GeoPointND> selectedPoints) {
super(view3D, selectedPoints,
new GeoVector3D(view3D.getKernel().getConstruction()));
}
@Override
protected void setPreviewableCoords(GeoPointND firstPoint,
GeoPointND secondPoint) {
((GeoVector3D) getGeoElement())
.setCoords(secondPoint.getInhomCoordsInD3()
.sub(firstPoint.getInhomCoordsInD3()).get());
try {
((GeoVector3D) getGeoElement()).setStartPoint(firstPoint);
} catch (CircularDefinitionException e) {
e.printStackTrace();
}
}
private Coords[] points = { Coords.createInhomCoorsInD3(),
Coords.createInhomCoorsInD3() };
@Override
protected Coords[] calcPoints() {
GeoVectorND geo = ((GeoVectorND) getGeoElement());
geo.updateStartPointPosition();
if (geo.getStartPoint() == null) {
points[0].set(0, 0, 0);
} else {
points[0].set3(geo.getStartPoint().getInhomCoordsInD3());
}
points[1].setAdd3(points[0], geo.getCoordsInD3());
return points;
}
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);
}
}