public static Pnt2d FindEllipseCenterFromEndpoints(Pnt2d startPnt, Pnt2d endPnt, double rX, double rY, double angle, bool sense) { // https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes // F.6.5.1 var matRotation = new Mat2d(); matRotation.SetRotation(-angle); var v1 = new XY(startPnt.X - endPnt.X, startPnt.Y - endPnt.Y) .Multiplied(0.5) .Multiplied(matRotation); // F.6.5.2 var denom = rX.Sqr() * v1.Y.Sqr() + rY.Sqr() * v1.X.Sqr(); var numer = rX.Sqr() * rY.Sqr() - denom; var root = Math.Sqrt(Math.Abs(numer / denom)) * (sense ? -1 : 1); var c1 = new XY(rX * v1.Y / rY, -(rY * v1.X / rX)).Multiplied(root); // F.6.5.3 matRotation.SetRotation(angle); var c = new XY(startPnt.X + endPnt.X, startPnt.Y + endPnt.Y) .Multiplied(0.5) .Added(c1.Multiplied(matRotation)); return(c.ToPnt()); }