Search code examples
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.