/* 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. */ /* * AlgoTangentLine.java * * Created on 30. August 2001, 21:37 */ package org.geogebra.common.kernel.algos; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.geos.GeoConic; import org.geogebra.common.kernel.geos.GeoLine; import org.geogebra.common.kernel.geos.GeoPoint; import org.geogebra.common.kernel.geos.GeoVector; import org.geogebra.common.kernel.kernelND.GeoConicND; import org.geogebra.common.kernel.kernelND.GeoLineND; /** * * @author Markus */ public class AlgoTangentLine extends AlgoTangentLineND { private GeoVector direction; /** Creates new AlgoTangentLine */ AlgoTangentLine(Construction cons, String label, GeoLineND g, GeoConicND c) { super(cons, label, g, c); } public AlgoTangentLine(Construction cons, String[] labels, GeoLineND g, GeoConicND c) { super(cons, labels, g, c); } @Override protected void initDiameterAndDirection() { // the tangents are computed by intersecting the // diameter line of g with c diameter = new GeoLine(cons); direction = new GeoVector(cons); ((GeoLine) g).getDirection(direction); c.diameterLine(direction, diameter); algoIntersect = new AlgoIntersectLineConic(cons, diameter, (GeoConic) c); // this is only an internal Algorithm that shouldn't be in the // construction list cons.removeFromConstructionList(algoIntersect); tangentPoints = algoIntersect.getIntersectionPoints(); } @Override protected void setTangents() { tangents = new GeoLine[2]; tangents[0] = new GeoLine(cons); tangents[1] = new GeoLine(cons); ((GeoLine) tangents[0]).setStartPoint((GeoPoint) tangentPoints[0]); ((GeoLine) tangents[1]).setStartPoint((GeoPoint) tangentPoints[1]); } /** * Inits the helping interesection algorithm to take the current position of * the lines into account. This is important so the the tangent lines are * not switched after loading a file */ @Override public void initForNearToRelationship() { AlgoTangentPoint.initForNearToRelationship(tangentPoints, tangents[0], algoIntersect); } @Override protected void updateDiameterLine() { ((GeoLine) g).getDirection(direction); c.diameterLine(direction, diameter); } @Override protected void updateTangent(int index) { GeoLine tangent = (GeoLine) tangents[index]; GeoLine line = (GeoLine) g; GeoPoint point = (GeoPoint) tangentPoints[index]; // tangent.x = line.x; // tangent.y = line.y; // tangent.z = -(point.inhomX * line.x + point.inhomY * line.y); tangent.setCoords(line.x, line.y, -(point.inhomX * line.x + point.inhomY * line.y)); } @Override protected void updateTangentParabola() { GeoLine tangent0 = (GeoLine) tangents[0]; GeoLine tangent1 = (GeoLine) tangents[1]; GeoLine line = (GeoLine) g; GeoPoint point0 = (GeoPoint) tangentPoints[0]; GeoPoint point1 = (GeoPoint) tangentPoints[1]; // tangent.x = line.x; // tangent.y = line.y; double z0 = -(point0.inhomX * line.x + point0.inhomY * line.y); double z1 = -(point1.inhomX * line.x + point1.inhomY * line.y); // parabola will have just 1 tangent if (Double.isNaN(z1)) { tangent0.setCoords(line.x, line.y, z0); } else { tangent0.setCoords(line.x, line.y, z1); } tangent1.setUndefined(); } }