public static Parabola2d FromFocusAndDirectrix(Point2d focus, Line2d directrix) { Point2d ondir = directrix.ClosestPointInfinite(focus); Point2d vertex = new Point2d(0.5 * (ondir.X + focus.X), 0.5 * (ondir.Y + focus.Y)); double focdist = focus.Distance(vertex); double rot = focus.Angle(ondir) + MathUtil.Deg90; if (focdist <= 1e-30) { return(null); } return(new Parabola2d(vertex, rot, focdist)); }
public override Point2d ClosestPoint(Point2d from) { if (Linear) { return(new Line2d(start, end).ClosestPoint(from)); } Point2d ce = Center; Point2d oncirc = ce.Polar(ce.Angle(from), Radius); if (IsCirclePointOnArc(oncirc)) { return(oncirc); } return(from.ClosestPoint(start, end)); }