/* GeoGebra - Dynamic Mathematics for Everyone http://www.geogebra.org This file is part of GeoGebra. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. */ 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.StringTemplate; import org.geogebra.common.kernel.Matrix.CoordSys; 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.GeoConicND; import org.geogebra.common.kernel.kernelND.GeoLineND; import org.geogebra.common.kernel.kernelND.GeoPointND; /** * Compute a circle with axis and through a point * * @author matthieu */ public class AlgoCircle3DAxisPoint extends AlgoElement3D { private GeoLineND axis; // input private GeoPointND point; // input private GeoConic3D circle; // output private CoordSys coordsys; public AlgoCircle3DAxisPoint(Construction cons, String label, GeoLineND axis, GeoPointND point) { super(cons); this.axis = axis; this.point = point; circle = new GeoConic3D(cons); coordsys = new CoordSys(2); circle.setCoordSys(coordsys); setInputOutput( new GeoElement[] { (GeoElement) axis, (GeoElement) point }, new GeoElement[] { circle }); // compute line compute(); circle.setLabel(label); } /** * * @return circle */ public GeoConic3D getCircle() { return circle; } private Coords center = Coords.createInhomCoorsInD3(); @Override public final void compute() { Coords p = point.getInhomCoordsInD3(); Coords o = axis.getPointInD(3, 0).getInhomCoordsInSameDimension(); Coords d = axis.getDirectionInD3(); // project the point on the axis p.projectLine(o, d, center, null); Coords v1 = p.sub(center); setCircle(circle, coordsys, center, v1, d); } /** * set conic to circle with center, radius vector, axis direction * * @param conic * conic * @param coordsys * coord sys * @param center * center * @param v1 * radius vector * @param d * axis direction */ static final public void setCircle(GeoConicND conic, CoordSys coordsys, Coords center, Coords v1, Coords d) { // recompute the coord sys coordsys.resetCoordSys(); coordsys.addPoint(center); coordsys.addVector(v1); coordsys.addVector(d.crossProduct(v1)); coordsys.makeOrthoMatrix(false, false); // set the circle v1.calcNorm(); conic.setDefined(); conic.setSphereND(O, v1.getNorm()); } static final private Coords O = new Coords(0, 0); @Override public Commands getClassName() { return Commands.Circle; } @Override final public String toString(StringTemplate tpl) { return getLoc().getPlain("CircleOfAxisAThroughB", ((GeoElement) axis).getLabel(tpl), point.getLabel(tpl)); } }