Circle2D.java
- package org.drip.zen.geometry;
- import org.drip.zen.equation.Quadratic;
- /*
- * Circle2D
- *
- * 1) Instance Fields - center and radius
- * 2) Get the fields
- * 3) Calculate Area
- * 4) Calculate Perimeter
- * 5) Closest Distance to a Point
- * 6) Do they Overlap
- * 7) Do they Touch
- * 8) Distance between a Line and the Circle
- * 9) Does Line intersect the Circle
- * 10) Point inside Circle
- * 11) Intersection Between Circle and Line
- * 12) Concept of Intersection - satisfy equations of both line AND circle
- * 13) Derive the Quadratic Equations
- * 14) Formulate them and encode them
- * 15) Solve for them
- * 16) Translate Circles - 20 Match 2016 #1
- * 17) Angle Extended at Origin - 20 March 2016 #7
- * 17) Tangents to Circle - Formulation + Conception - 20 March 2016 #8
- * 18) Tangential Points - Implementation - 20 March 2016 #9
- * 19) Bring it together - 20 March 2016 #10
- */
- public class Circle2D {
- private Point2D _center;
- private double _radius;
- public Circle2D (Point2D center, double radius)
- {
- _center = center;
- _radius = radius;
- }
- public Point2D getCenter()
- {
- return _center;
- }
- public double getRadius()
- {
- return _radius;
- }
- public double area()
- {
- double circleArea = Math.PI * _radius * _radius;
- return circleArea;
- }
- public double perimeter()
- {
- double circumference = 2. * Math.PI * _radius;
- return circumference;
- }
- public boolean overlap (Circle2D anotherCircle)
- {
- double centerX1 = _center.getX();
- double centerY1 = _center.getY();
- double centerX2 = anotherCircle.getCenter().getX();
- double centerY2 = anotherCircle.getCenter().getY();
- double radius1 = getRadius();
- double radius2 = anotherCircle.getRadius();
- double distanceBetweenCenters = Math.sqrt ((centerX1 - centerX2) * (centerX1 - centerX2) + (centerY1 - centerY2) * (centerY1 - centerY2));
- boolean circlesIntersect = false;
- if (distanceBetweenCenters < radius1 + radius2)
- circlesIntersect = true;
- else
- circlesIntersect = false;
- return circlesIntersect;
- }
- public boolean touch (Circle2D anotherCircle)
- {
- double centerX1 = _center.getX();
- double centerY1 = _center.getY();
- double centerX2 = anotherCircle.getCenter().getX();
- double centerY2 = anotherCircle.getCenter().getY();
- double radius1 = getRadius();
- double radius2 = anotherCircle.getRadius();
- double distanceBetweenCenters = Math.sqrt ((centerX1 - centerX2) * (centerX1 - centerX2) + (centerY1 - centerY2) * (centerY1 - centerY2));
- boolean circlesTouch = false;
- if (distanceBetweenCenters == radius1 + radius2)
- circlesTouch = true;
- else
- circlesTouch = false;
- return circlesTouch;
- }
- public double distanceToLine (Line2D line)
- {
- Line2D perpendicularLine = line.perpendicularLineAtPoint (getCenter());
- Point2D intersectingPoint = line.intersection (perpendicularLine);
- double distance = intersectingPoint.distanceBetweenPoints (getCenter());
- return distance;
- }
- public boolean linePassesThrough (Line2D line)
- {
- double distanceBetweenLineAndCenter = distanceToLine (line);
- boolean linePassesThroughTheCircle = false;
- if (distanceBetweenLineAndCenter < getRadius())
- linePassesThroughTheCircle = true;
- else
- linePassesThroughTheCircle = false;
- return linePassesThroughTheCircle;
- }
- public boolean inside (Point2D p)
- {
- boolean inside = false;
- double distanceFromCenter = p.distanceBetweenPoints (getCenter());
- if (distanceFromCenter < getRadius())
- inside = true;
- else
- inside = false;
- return inside;
- }
- public Point2D[] intersections (Line2D l)
- {
- double x1 = _center.getX();
- double y1 = _center.getY();
- double r = _radius;
- double m = l.slope();
- double b = l.yIntercept();
- double quadraticA = 1 + m * m;
- double quadraticB = -2 * x1 + 2 * m * b - 2 * m * y1;
- double quadraticC = x1 * x1 + b * b - 2 * b * y1 + y1 * y1 - r * r;
- Quadratic quad = new Quadratic (quadraticA, quadraticB, quadraticC);
- double[] intersectionX = quad.findRoots();
- if (null == intersectionX) return null;
- Point2D[] intersectingPoints = new Point2D[2];
- intersectingPoints[0] = new Point2D (intersectionX[0], l.YFromX (intersectionX[0]));
- intersectingPoints[1] = new Point2D (intersectionX[1], l.YFromX (intersectionX[1]));
- return intersectingPoints;
- }
- /*
- * Added 20 March 2016
- */
- public boolean translate (double xAmount, double yAmount)
- {
- return _center.translate (xAmount, yAmount);
- }
- public double angleAtOrigin()
- {
- double distanceFromCenterToOrigin = _center.distanceFromOrigin();
- double originAngle = Math.asin (_radius / distanceFromCenterToOrigin);
- return originAngle;
- }
- public Point2D[] tangentsFromOrigin()
- {
- double centerAngleAtOrigin = _center.angleAtOrigin() * Math.PI / 180.;
- double circleAngleAtOrigin = angleAtOrigin();
- double tangentDistanceFromOrigin = _radius / Math.sin (centerAngleAtOrigin);
- double angleAbove = centerAngleAtOrigin + circleAngleAtOrigin;
- double angleBelow = centerAngleAtOrigin - circleAngleAtOrigin;
- Point2D[] tangentPoints = new Point2D[2];
- tangentPoints[0] = Point2D.MakeFromPolar (tangentDistanceFromOrigin, angleAbove);
- tangentPoints[1] = Point2D.MakeFromPolar (tangentDistanceFromOrigin, angleBelow);
- return tangentPoints;
- }
- /*
- * Done Adding 20 March 2016
- */
- public static void main (String[] args)
- {
- Point2D myCenter = new Point2D (0, 0);
- double myRadius = 1;
- Circle2D myCircle = new Circle2D (myCenter, myRadius);
- Line2D myLine = new Line2D (1, 0);
- Point2D[] circleLineIntersections = myCircle.intersections (myLine);
- circleLineIntersections[0].printCoordinate();
- circleLineIntersections[1].printCoordinate();
- /*
- * Added 20 March 2016
- */
- Point2D anotherCenter = new Point2D (5, 5);
- double anotherRadius = 1;
- Circle2D anotherCircle = new Circle2D (anotherCenter, anotherRadius);
- Point2D[] tangentialPoints = anotherCircle.tangentsFromOrigin();
- System.out.println();
- System.out.println ("\tCenter Angle At Origin: " + anotherCircle._center.angleAtOrigin());
- System.out.println ("\tCircle Angle At Origin: " + anotherCircle.angleAtOrigin());
- System.out.println();
- tangentialPoints[0].printCoordinate();
- tangentialPoints[1].printCoordinate();
- System.out.println();
- tangentialPoints[0].printPolarCoordinate();
- tangentialPoints[1].printPolarCoordinate();
- /*
- * Done Adding 20 March 2016
- */
- }
- }