如何找到椭圆的方程式
How to find the equation for an ellipse
我希望使用二次曲线的一般方程找到给定五个或六个点的椭圆的方程:
A x2 + B xy + C y2 + D x + E y + F = 0。
起初我尝试使用六个点。这是我的 python 代码:
import numpy as np
def conic_section(p1, p2, p3, p4, p5, p6):
def row(point):
return [point[0]*point[0], point[0]*point[1], point[1]*point[1],
point[0], point[1], 1]
matrix=np.matrix([row(p1),row(p2),row(p3),row(p4),row(p5), row(p6)])
b=[0,0,0,0,0,0]
return np.linalg.solve(matrix,b)
print conic_section(np.array([6,5]), np.array([2,9]), np.array([0,0]),
np.array([11, 5.5]), np.array([6, 7]), np.array([-1,-1]))
问题是这将 return 解 [0,0,0,0,0,0] 因为我的等式右边是零向量。
然后我尝试通过减去 F 并将其除以来改变二次曲线:
A x2 + B xy + C y2 + D x + E y + F = 0
A x2 + B xy + C y2 + D x + E y = -F
A' x2 + B xy + C' y2 + D' x + E' y = -1.
这不起作用的原因是,如果我的观点之一是 (0,0),那么我最终会得到一个具有一行零的矩阵,但右侧对于向量中的条目,方程式的值为 -1。换句话说,如果我的一个点是 (0,0) - 那么 "F" 应该是 0,所以我不能把它分开。
如有任何帮助,我们将不胜感激。
谢谢。
椭圆方程(无平移旋转):
目标是通过 F
求解变量 A
中的这个 线性方程 :
使用:
from math import sin, cos, pi, sqrt
import matplotlib.pyplot as plt
import numpy as np
from numpy.linalg import eig, inv
# basis parameters of the ellipse
a = 7
b = 4
def ellipse(t, a, b):
return a*cos(t), b*sin(t)
points = [ellipse(t, a, b) for t in np.linspace(0, 2*pi, 100)]
x, y = [np.array(v) for v in list(zip(*points))]
fig = plt.figure()
plt.scatter(x, y)
plt.show()
def fit_ellipse(x, y):
x = x[:, np.newaxis]
y = y[:, np.newaxis]
D = np.column_stack((x**2, x*y, y**2, x, y, np.ones_like(x)))
S = np.dot(D.T, D)
C = np.zeros([6,6])
C[0, 2] = C[2, 0] = 2
C[1, 1] = -1
E, V = eig(np.dot(inv(S), C))
n = np.argmax(np.abs(E))
return V[:, n]
A, B, C, D, E, F = fit_ellipse(x, y)
K = D**2/(4*A) + E**2/(4*C) - F
# a, b
print('a:', sqrt(K/A), 'b:', sqrt(K/C))
输出:
a: 6.999999999999998 b: 4.0
参见:
http://mathworld.wolfram.com/ConicSection.html
https://fr.wikipedia.org/wiki/Ellipse_(math%C3%A9matiques)#Forme_matricielle
http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html
看来你在椭圆上有精确的点,不需要近似,并通过某种奇怪的方式对圆锥曲线使用 Braikenridge-Maclaurin 构造。
五个点(x[i],y[i])
用这个显式方程确定椭圆(mathworld page, eq. 8)
所以要求椭圆方程,可以对第一行的行列式求cofactor expansion。例如,系数A
是从x1y1
到右下角的子矩阵的行列式值,系数B
是没有xiyi
列的子矩阵的行列式取反值等等。
我希望使用二次曲线的一般方程找到给定五个或六个点的椭圆的方程: A x2 + B xy + C y2 + D x + E y + F = 0。
起初我尝试使用六个点。这是我的 python 代码:
import numpy as np
def conic_section(p1, p2, p3, p4, p5, p6):
def row(point):
return [point[0]*point[0], point[0]*point[1], point[1]*point[1],
point[0], point[1], 1]
matrix=np.matrix([row(p1),row(p2),row(p3),row(p4),row(p5), row(p6)])
b=[0,0,0,0,0,0]
return np.linalg.solve(matrix,b)
print conic_section(np.array([6,5]), np.array([2,9]), np.array([0,0]),
np.array([11, 5.5]), np.array([6, 7]), np.array([-1,-1]))
问题是这将 return 解 [0,0,0,0,0,0] 因为我的等式右边是零向量。
然后我尝试通过减去 F 并将其除以来改变二次曲线:
A x2 + B xy + C y2 + D x + E y + F = 0
A x2 + B xy + C y2 + D x + E y = -F
A' x2 + B xy + C' y2 + D' x + E' y = -1.
这不起作用的原因是,如果我的观点之一是 (0,0),那么我最终会得到一个具有一行零的矩阵,但右侧对于向量中的条目,方程式的值为 -1。换句话说,如果我的一个点是 (0,0) - 那么 "F" 应该是 0,所以我不能把它分开。
如有任何帮助,我们将不胜感激。 谢谢。
椭圆方程(无平移旋转):
目标是通过 F
求解变量 A
中的这个 线性方程 :
使用:
from math import sin, cos, pi, sqrt
import matplotlib.pyplot as plt
import numpy as np
from numpy.linalg import eig, inv
# basis parameters of the ellipse
a = 7
b = 4
def ellipse(t, a, b):
return a*cos(t), b*sin(t)
points = [ellipse(t, a, b) for t in np.linspace(0, 2*pi, 100)]
x, y = [np.array(v) for v in list(zip(*points))]
fig = plt.figure()
plt.scatter(x, y)
plt.show()
def fit_ellipse(x, y):
x = x[:, np.newaxis]
y = y[:, np.newaxis]
D = np.column_stack((x**2, x*y, y**2, x, y, np.ones_like(x)))
S = np.dot(D.T, D)
C = np.zeros([6,6])
C[0, 2] = C[2, 0] = 2
C[1, 1] = -1
E, V = eig(np.dot(inv(S), C))
n = np.argmax(np.abs(E))
return V[:, n]
A, B, C, D, E, F = fit_ellipse(x, y)
K = D**2/(4*A) + E**2/(4*C) - F
# a, b
print('a:', sqrt(K/A), 'b:', sqrt(K/C))
输出:
a: 6.999999999999998 b: 4.0
参见:
http://mathworld.wolfram.com/ConicSection.html https://fr.wikipedia.org/wiki/Ellipse_(math%C3%A9matiques)#Forme_matricielle http://nicky.vanforeest.com/misc/fitEllipse/fitEllipse.html
看来你在椭圆上有精确的点,不需要近似,并通过某种奇怪的方式对圆锥曲线使用 Braikenridge-Maclaurin 构造。
五个点(x[i],y[i])
用这个显式方程确定椭圆(mathworld page, eq. 8)
所以要求椭圆方程,可以对第一行的行列式求cofactor expansion。例如,系数A
是从x1y1
到右下角的子矩阵的行列式值,系数B
是没有xiyi
列的子矩阵的行列式取反值等等。