mathgeometrysvgvmlellipse

How to calculate center of an ellipse by two points and radius sizes


While working on SVG implementation for Internet Explorer to be based on its own VML format I came to a problem of translation of an SVG elliptical arc to an VML elliptical arc.

In VML an arc is given by: two angles for two points on ellipse and lengths of radiuses, In SVG an arc is given by: two pairs of coordinates for two points on ellipse and sizes of ellipse boundary box

So, the question is: How to express angles of two points on ellipse to two pairs of their coordinates. An intermediate question could be: How to find the center of an ellipse by coordinates of a pair of points on its curve.

Update: Let's have a precondition saying that an ellipse is normally placed (its radiuses are parallel to linear coordinate system axis), thus no rotation is applied.

Update: This question is not related to svg:ellipse element, rather to "a" elliptical arc command in svg:path element (SVG Paths: The elliptical arc curve commands)


Solution

  • So the solution is here:

    The parametrized formula of an ellipse:

    x = x0 + a * cos(t)
    y = y0 + b * sin(t)
    

    Let's put known coordinates of two points to it:

    x1 = x0 + a * cos(t1)
    x2 = x0 + a * cos(t2)
    y1 = y0 + b * sin(t1)
    y2 = y0 + b * sin(t2)
    

    Now we have a system of equations with 4 variables: center of ellipse (x0/y0) and two angles t1, t2

    Let's subtract equations in order to get rid of center coordinates:

    x1 - x2 = a * (cos(t1) - cos(t2))
    y1 - y2 = b * (sin(t1) - sin(t2))
    

    This can be rewritten (with product-to-sum identities formulas) as:

    (x1 - x2) / (2 * a) = sin((t1 + t2) / 2) * sin((t1 - t2) / 2)
    (y2 - y1) / (2 * b) = cos((t1 + t2) / 2) * sin((t1 - t2) / 2)
    

    Let's replace some of the equations:

    r1: (x1 - x2) / (2 * a)
    r2: (y2 - y1) / (2 * b)
    a1: (t1 + t2) / 2
    a2: (t1 - t2) / 2
    

    Then we get simple equations system:

    r1 = sin(a1) * sin(a2)
    r2 = cos(a1) * sin(a2)
    

    Dividing first equation by second produces:

    a1 = arctan(r1/r2)
    

    Adding this result to the first equation gives:

    a2 = arcsin(r2 / cos(arctan(r1/r2)))
    

    Or, simple (using compositions of trig and inverse trig functions):

    a2 = arcsin(r2 / (1 / sqrt(1 + (r1/r2)^2)))
    

    or even more simple:

    a2 = arcsin(sqrt(r1^2 + r2^2))
    

    Now the initial four-equations system can be resolved with easy and all angles as well as eclipse center coordinates can be found.