在将Internet Explorer基于其自身的VML格式进行SVG实现时,我遇到了将SVG椭圆弧转换为VML椭圆弧的问题。
在VML中,圆弧由以下形式给出:椭圆上两个点的两个 Angular 和半径的长度,
在SVG中,圆弧由下式给出:椭圆上两个点的两对坐标和椭圆边界框的大小
因此,问题是:如何将椭圆上的两个点的 Angular 表示为其两对坐标。
中间的问题可能是:如何通过曲线上的一对点的坐标来找到椭圆的中心。
更新:让我们有一个前提条件,即通常放置椭圆(其半径与线性坐标系轴平行),因此不应用旋转。
更新:此问题与svg:ellipse元素无关,而是与svg:path元素(SVG Paths: The elliptical arc curve commands)中的“a”椭圆弧命令有关
最佳答案
所以解决方案在这里:
椭圆的参数化公式:
x = x0 + a * cos(t)
y = y0 + b * sin(t)
让我们将两点的已知坐标放到上面:
x1 = x0 + a * cos(t1)
x2 = x0 + a * cos(t2)
y1 = y0 + b * sin(t1)
y2 = y0 + b * sin(t2)
现在我们有了一个包含4个变量的方程组:椭圆中心(x0 / y0)和两个 Angular t1,t2
让我们减去方程式以摆脱中心坐标:
x1-x2 = a *(cos(t1)-cos(t2))
y1-y2 = b *(sin(t1)-sin(t2))
可以将其重写为乘积和恒等式:
(x1-x2)/(2 * a)= sin((t1 + t2)/ 2)* sin((t1-t2)/ 2)
(y2-y1)/(2 * b)= cos((t1 + t2)/ 2)* sin((t1-t2)/ 2)
让我们替换一些方程式:
r1:(x1-x2)/(2 * a)
r2:(y2-y1)/(2 * b)
a1:(t1 + t2)/ 2
a2:(t1-t2)/ 2
然后我们得到简单的方程组:
r1 = sin(a1)* sin(a2)
r2 = cos(a1)* sin(a2)
将第一个等式除以第二个将产生:
a1 = arctan(r1 / r2)
将此结果加到第一个方程式中得出:
a2 = arcsin(r2 / cos(arctan(r1 / r2)))
或者,简单(使用trig和反trig函数的组合):
a2 = arcsin(r2 / / 1 / sqrt(1 +(r1 / r2)^ 2)))
甚至更简单:
a2 =反正弦(sqrt(r1 ^ 2 + r2 ^ 2))
现在,可以轻松地求解初始的四方程组,并且可以找到所有 Angular 以及 eclipse 中心坐标。
关于math - 如何通过两个点和半径大小计算椭圆的中心,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/197649/