package org.geogebra.common.geogebra3D.kernel3D.algos; import org.geogebra.common.geogebra3D.kernel3D.geos.GeoPoint3D; import org.geogebra.common.geogebra3D.kernel3D.geos.GeoPolygon3D; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.Matrix.Coords; import org.geogebra.common.kernel.algos.AlgoPolygonRegularND; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoNumberValue; import org.geogebra.common.kernel.geos.GeoPoint; import org.geogebra.common.kernel.geos.GeoPolygon; import org.geogebra.common.kernel.kernelND.GeoDirectionND; import org.geogebra.common.kernel.kernelND.GeoPointND; /** * Regular polygon with 3D points * * @author mathieu * */ public class AlgoPolygonRegular3D extends AlgoPolygonRegularND { private GeoDirectionND direction; /** * constructor * * @param c * construction * @param labels * output labels * @param A1 * first vertex * @param B1 * second vertex * @param num * number of vertices * @param direction * direction of the plane */ public AlgoPolygonRegular3D(Construction c, String[] labels, GeoPointND A1, GeoPointND B1, GeoNumberValue num, GeoDirectionND direction) { super(c, labels, A1, B1, num, direction); } @Override protected GeoPolygon newGeoPolygon(Construction cons1) { return new GeoPolygon3D(cons1); } @Override protected GeoElement newGeoPoint(Construction cons1) { GeoPoint3D newPoint = new GeoPoint3D(cons1); newPoint.setCoords(0, 0, 0, 1); return newPoint; } // for AlgoElement @Override protected void setInputOutput() { input = new GeoElement[4]; input[0] = (GeoElement) A; input[1] = (GeoElement) B; input[2] = num.toGeoElement(); input[3] = (GeoElement) direction; // set dependencies for (int i = 0; i < input.length; i++) { input[i].addAlgorithm(this); } cons.addToAlgorithmList(this); // setOutput(); done in compute // parent of output getPoly().setParentAlgorithm(this); } @Override protected void setDirection(GeoDirectionND direction) { this.direction = direction; } private Coords coordsA, coordsB, vAB, vDirection; @Override protected void setCenterPoint(int n, double beta) { // some temp values Coords m = coordsA.add(coordsB).mul(0.5); // normal vector of AB and direction Coords vn = vDirection.crossProduct4(vAB); // center point of regular polygon double tanBetaHalf = Math.tan(beta) / 2; ((GeoPoint3D) centerPoint).setCoords(m.add(vn.mul(tanBetaHalf))); } @Override protected void rotate(GeoPointND point) { ((GeoPoint3D) point).rotate(rotAngle, centerPoint, direction); } @Override protected boolean checkUnDefined(int n) { boolean ret = super.checkUnDefined(n); coordsA = A.getInhomCoordsInD3(); coordsB = B.getInhomCoordsInD3(); vAB = coordsB.sub(coordsA); vDirection = direction.getDirectionInD3(); if (!Kernel.isZero(vAB.dotproduct(vDirection))) { getPoly().setUndefined(); // set also points (and thus segments) undefined for (int i = 0; i < outputPoints.size(); i++) { outputPoints.getElement(i).setUndefined(); } if (getPoly().getPointsND() == null) { getPoly().setPoints(new GeoPointND[] { A, B }, null, false); } numOld = 2; return true; } return ret; } @Override public void calcCentroid(GeoPoint p) { // TODO Auto-generated method stub } }