package org.geogebra.common.geogebra3D.kernel3D.algos;
import java.util.TreeMap;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoPlane3D;
import org.geogebra.common.geogebra3D.kernel3D.geos.GeoPolyhedron;
import org.geogebra.common.kernel.Construction;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.Matrix.Coords;
import org.geogebra.common.kernel.commands.Commands;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.kernelND.GeoSegmentND;
import org.geogebra.common.kernel.kernelND.HasSegments;
public class AlgoIntersectPlanePolyhedron extends AlgoIntersectLinePolygon3D {
private GeoPlane3D plane;
public AlgoIntersectPlanePolyhedron(Construction c, String[] labels,
GeoPlane3D plane, GeoPolyhedron p) {
super(c, labels, plane, p);
}
@Override
protected void setFirstInput(GeoElement geo) {
this.plane = (GeoPlane3D) geo;
}
@Override
protected GeoElement getFirstInput() {
return plane;
}
@Override
protected void setIntersectionLine() {
/*
* Coords[] intersection = CoordMatrixUtil.intersectPlanes(
* plane.getCoordSys().getMatrixOrthonormal(),
* currentFace.getCoordSys().getMatrixOrthonormal());
*
* o1 = intersection[0]; d1 = intersection[1];
*/
}
// private GeoPolygon currentFace;
@Override
protected void intersectionsCoords(HasSegments p,
TreeMap<Double, Coords> newCoords) {
/*
* GeoPolyhedron polyh = (GeoPolyhedron) p; TreeSet<GeoPolygon> polygons
* = new TreeSet<GeoPolygon>();
* polygons.addAll(polyh.getPolygonsLinked());
* polygons.addAll(polyh.getPolygons()); currentFace = polygons.first();
* polygons.remove(currentFace); Log.debug(currentFace); TreeMap<Double,
* Coords> currentFaceCoords = new TreeMap<Double, Coords>();
* intersectionsCoordsContained(currentFace, currentFaceCoords); if
* (currentFaceCoords.size()>0){ Object[] points =
* currentFaceCoords.values().toArray(); Coords b = (Coords) points[0];
* for (int i=1; i<points.length; i++){ Coords a = b; b = (Coords)
* points[i]; Log.debug("\na=\n"+a); Log.debug("\nb=\n"+b); Coords c2D =
* currentFace.getNormalProjection(a.add(b).mul(0.5))[1];
* Log.debug(currentFace.isInRegion(c2D.getX(), c2D.getY())); } }
*/
for (int i = 0; i < p.getSegments().length; i++) {
GeoSegmentND seg = p.getSegments()[i];
Coords coords = intersectionCoords(seg);
if (coords != null) {
newCoords.put((double) i, coords);
}
}
}
private Coords intersectionCoords(GeoSegmentND seg) {
Coords o = seg.getPointInD(3, 0).getInhomCoordsInSameDimension();
Coords d = seg.getPointInD(3, 1).getInhomCoordsInSameDimension().sub(o);
Coords globalCoords = new Coords(4);
Coords inPlaneCoords = new Coords(4);
o.projectPlaneThruV(plane.getCoordSys().getMatrixOrthonormal(), d,
globalCoords, inPlaneCoords);
// check if projection is intersection point
if (!Kernel.isZero(globalCoords.getW())
&& seg.respectLimitedPath(-inPlaneCoords.get(3))) {
return globalCoords;
}
return null;
}
@Override
protected boolean checkParameter(double t1) {
return true;
}
@Override
public Commands getClassName() {
return Commands.Intersect;
}
}