public static Circle2d[] PointPoint(Point2d p1, Point2d p2, double radius) { // compute the circles which intersect at p1,p2 with radius 'rad' double a = p1.Distance(p2); if (MathUtil.IsZero(a)) { return(null); //through one point } double d = 4.0 * radius * radius - a * a; if (d < 0.0) { return(null); //not possible } d = Math.Sqrt(d) * 0.5; //vector from midpoint of p1-p2 to center of circles //that is vector p2-p1, rotaded 90 degrees, normalized and multiplied by distance to circle center double vx = ((p2.Y - p1.Y) / a) * d; double vy = -((p2.X - p1.X) / a) * d; double midx = (p1.X + p2.X) * 0.5; double midy = (p1.Y + p2.Y) * 0.5; return(new Circle2d[] { new Circle2d(midx + vx, midy + vy, radius), new Circle2d(midx - vx, midy - vy, radius) }); }
public override double Distance(Point2d p) { if (IsAngleOnArc(Center.Angle(p))) { return(Center.Distance(p) - Radius); } else { return(Math.Min(start.Distance(p), end.Distance(p))); } }
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 double Distance(Point2d p) { return(Math.Abs(center.Distance(p) - radius)); }
public static Circle2d From2Points(Point2d p1, Point2d p2) { Point2d center = new Point2d((p1.X + p2.X) / 2.0, (p1.Y + p2.Y) / 2.0); return(new Circle2d(center, center.Distance(p1))); }