import { isPDFInstance, PDFClasses } from '../../api/objects'; import { distance, distanceCoords, isEqual, minus, plus, times, unitVector, } from '../maths'; import GraphElement from './GraphElement'; import Point from './Point'; export default class Circle extends GraphElement { static className = () => PDFClasses.Circle; myClass(): PDFClasses { return PDFClasses.Circle; } O: Point; r: number; constructor(O: Point = new Point(), r = 1) { super(); this.O = O; this.r = r; } ray() { return this.r; } center() { return this.O; } /** This is used to standardize type Circle | Arc */ getCircle() { return this; } isEqual(element: GraphElement): boolean { return ( isPDFInstance(element, PDFClasses.Circle) && this.center().isEqual((element as Circle).center()) && isEqual(this.ray(), (element as Circle).ray()) ); } includes(P: Point) { return isEqual(distance(this.center(), P), this.ray()); } orthoProjection(P: Point) { const center = this.center().toCoords(); const coords = P.toCoords(); if (distanceCoords(coords, center) < this.ray()) return P; const vect = times(unitVector(minus(coords, center)), this.ray()); return new Point(plus(center, vect)); } }