楕円一般式:我々は、ellipse
のparametric
式から開始することができるRの一般的な式を与えて楕円をプロットする方法は?
a * x^2 + b * y^2 + c * x * y + d * x + e * y + f = 0
楕円一般式:我々は、ellipse
のparametric
式から開始することができるRの一般的な式を与えて楕円をプロットする方法は?
a * x^2 + b * y^2 + c * x * y + d * x + e * y + f = 0
(以下のいずれかがウィキペディアからのものである)、我々は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
式から起動する場合、それは2段階のプロセスです。
我々は最初http://www.cs.cornell.edu/cv/OtherPdf/Ellipse.pdfから採取された下図(詳細な数学から5式を用いて5つのパラメータを得るために、以下の式を使用することができ、フォームが見つけることができ、polar
(parametric
)にcartesian
式換算)。
上記のように、取得したパラメータを使用して楕円をプロットします。ステップについて
(我々はA,B,C,D,E,F
を知っている場合)(1)我々は、次のコードを使用することができます。
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-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')
もう1つの答えは、楕円をプロットする方法を示していますes。しかし、それらは一般的な楕円方程式からは明らかではない。ここでは、最初から始めます。数学的な導出を省略
は、次の式からセンターに解決する必要があります。
(おっと: "u
を生成し、" ない "v
を生成" でなければなりません。元のLaTeXが見当たらず、もう一度タイプしたくないので修正できません...
plot.ellipse <- function (a, b, c, d, e, f, n.points = 1000) {
## solve for centre
A <- matrix(c(a, c/2, c/2, b), 2L)
B <- c(-d/2, -e/2)
mu <- solve(A, B)
## generate points on circle
r <- sqrt(a * mu[1]^2 + b * mu[2]^2 + c * mu[1] * mu[2] - f)
theta <- seq(0, 2 * pi, length = n.points)
v <- rbind(r * cos(theta), r * sin(theta))
## transform for points on ellipse
z <- backsolve(chol(A), v) + mu
## plot points
plot(t(z), type = "l")
}
いくつかの発言:ここでは)
がこれを行うためのR関数です
a, b, ..., f
のための条件があります。 else(放物線と言う)。したがって、テストするために任意のパラメータ値を渡さないでください。実際には、方程式からこのような要件をおおよそ見ることができます。たとえば、行列A
は正の値でなければなりません。したがって、a > 0
とdet(A) > 0
です。また、r^2 > 0
。car::ellipse
)を読んでください。コレスキー分解と固有分解の幾何学を説明する美しい図があります。偉大な答え!質問:どのように元の質問に 'f'パラメータがありましたが、あなたの解決策はありませんか?それは中止ですか? –
私の悪いです。私は最初の行列方程式だけを見ました。 –
したがって、正の確定性のチェックを追加すると、ユーザーが入力した任意のパラメータが楕円であれば問題ありません。 –
楕円を描画するためにRで使用できる関数は何ですか?私は彼らの議論に興味があります。 – MBo
パッケージの** ellipse **が役に立つかもしれません。親切にこのリンクをお試しください - https://cran.r-project.org/web/packages/ellipse/ellipse.pdf –