예제 #1
0
        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());
        }