我们可以从ellipse的parametric方程开始(以下来自*),我们需要5个参数:中心(xc, yc)或(h,k)另一种表示法,轴长度a, b和x 轴与主轴phi 或tau 之间的角度以另一种表示法表示。
xc <- 1 # center x_c or h
yc <- 2 # y_c or k
a <- 5 # major axis length
b <- 2 # minor axis length
phi <- pi/3 # angle of major axis with x axis phi or tau
t <- seq(0, 2*pi, 0.01)
x <- xc + a*cos(t)*cos(phi) - b*sin(t)*sin(phi)
y <- yc + a*cos(t)*cos(phi) + b*sin(t)*cos(phi)
plot(x,y,pch=19, col='blue')
现在,如果我们想从 cartesian conic 等式开始,这是一个两步过程。
将cartesian方程转换为polar(parametric),形式我们可以使用下面的方程,首先使用下图中的5个方程得到5个参数(取自http://www.cs.cornell.edu/cv/OtherPdf/Ellipse.pdf ,详细的数学可以在那里找到)。
使用获得的参数绘制椭圆,如上所示。
对于第 (1) 步,我们可以使用以下代码(当我们知道 A,B,C,D,E,F 时):
M0 <- matrix(c(F,D/2,E/2, D/2, A, B/2, E/2, B/2, C), nrow=3, byrow=TRUE)
M <- matrix(c(A,B/2,B/2,C), nrow=2)
lambda <- eigen(M)$values
abs(lambda - A)
abs(lambda - C)
# assuming abs(lambda[1] - A) < abs(lambda[1] - C), if not, swap lambda[1] and lambda[2] in the following equations:
a <- sqrt(-det(M0)/(det(M)*lambda[1]))
b <- sqrt(-det(M0)/(det(M)*lambda[2]))
xc <- (B*E-2*C*D)/(4*A*C-B^2)
yc <- (B*D-2*A*E)/(4*A*C-B^2)
phi <- pi/2 - atan((A-C)/B)*2
对于第 (2) 步,使用以下代码:
t <- seq(0, 2*pi, 0.01)
x <- xc + a*cos(t)*cos(phi) - b*sin(t)*sin(phi)
y <- yc + a*cos(t)*cos(phi) + b*sin(t)*cos(phi)
plot(x,y,pch=19, col='blue')