package org.geogebra.common.geogebra3D.kernel3D.algos;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoConic3D;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Matrix.CoordMatrix4x4;
import org.geogebra.common.kernel.Matrix.CoordSys;
import org.geogebra.common.kernel.Matrix.Coords;
import org.geogebra.common.kernel.algos.AlgoEllipseHyperbolaFociPointND;
import org.geogebra.common.kernel.geos.GeoPoint;
import org.geogebra.common.kernel.kernelND.GeoConicND;
import org.geogebra.common.kernel.kernelND.GeoDirectionND;
import org.geogebra.common.kernel.kernelND.GeoPointND;
public class AlgoEllipseHyperbolaFociPoint3D
extends AlgoEllipseHyperbolaFociPointND {
public AlgoEllipseHyperbolaFociPoint3D(Construction cons, String label,
GeoPointND A, GeoPointND B, GeoPointND C,
GeoDirectionND orientation, final int type) {
super(cons, label, A, B, C, orientation, type);
}
public AlgoEllipseHyperbolaFociPoint3D(Construction cons, String label,
GeoPointND A, GeoPointND B, GeoPointND C, final int type) {
this(cons, label, A, B, C, null, type);
}
@Override
protected GeoConicND newGeoConic(Construction cons) {
GeoConic3D ret = new GeoConic3D(cons);
ret.setCoordSys(new CoordSys(2));
return ret;
}
private GeoPoint A2d, B2d, C2d;
@Override
protected void setInputOutput() {
super.setInputOutput();
A2d = new GeoPoint(cons);
B2d = new GeoPoint(cons);
C2d = new GeoPoint(cons);
}
@Override
protected GeoPoint getA2d() {
return A2d;
}
@Override
protected GeoPoint getB2d() {
return B2d;
}
@Override
protected GeoPoint getC2d() {
return C2d;
}
/**
* @param cs
* ellipse coord sys
* @param Ac
* first focus coords
* @param Bc
* second focus coords
* @param Cc
* point on ellipse coords
* @return true if coord sys is possible
*/
protected boolean setCoordSys(CoordSys cs, Coords Ac, Coords Bc,
Coords Cc) {
// set the coord sys
cs.addPoint(Ac);
cs.addPoint(Bc);
cs.addPoint(Cc);
return cs.makeOrthoMatrix(false, false);
}
@Override
public void compute() {
CoordSys cs = conic.getCoordSys();
cs.resetCoordSys();
Coords Ac = A.getInhomCoordsInD3();
Coords Bc = B.getInhomCoordsInD3();
Coords Cc = C.getInhomCoordsInD3();
if (!setCoordSys(cs, Ac, Bc, Cc)) {
conic.setUndefined();
return;
}
// project the points on the coord sys
CoordMatrix4x4 matrix = cs.getMatrixOrthonormal();
Ac.projectPlaneInPlaneCoords(matrix, project);
A2d.setCoords(project.getX(), project.getY(), project.getW());
Bc.projectPlaneInPlaneCoords(matrix, project);
B2d.setCoords(project.getX(), project.getY(), project.getW());
Cc.projectPlaneInPlaneCoords(matrix, project);
C2d.setCoords(project.getX(), project.getY(), project.getW());
super.compute();
}
private Coords project;
@Override
protected void initCoords() {
project = new Coords(4);
}
}