2017-01-24 5 views
0

楕円一般式:我々は、ellipseparametric式から開始することができるRの一般的な式を与えて楕円をプロットする方法は?

a * x^2 + b * y^2 + c * x * y + d * x + e * y + f = 0 

enter image description here

+0

楕円を描画するためにRで使用できる関数は何ですか?私は彼らの議論に興味があります。 – MBo

+0

パッケージの** ellipse **が役に立つかもしれません。親切にこのリンクをお試しください - https://cran.r-project.org/web/packages/ellipse/ellipse.pdf –

答えて

2

(以下のいずれかがウィキペディアからのものである)、我々は5つのパラメータが必要です。他の表記法で中心(xc, yc)又は(h,k)を軸の長さa, bとx軸と長軸の間の角度phiまたはtauを別の表記で示します。

enter image description here

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') 

enter image description here

は、今、私たちは cartesian conic式から起動する場合、それは2段階のプロセスです。

  1. 我々は最初http://www.cs.cornell.edu/cv/OtherPdf/Ellipse.pdfから採取された下図(詳細な数学から5式を用いて5つのパラメータを得るために、以下の式を使用することができ、フォームが見つけることができ、polarparametric)にcartesian式換算)。

  2. 上記のように、取得したパラメータを使用して楕円をプロットします。ステップについて

enter image description here

(我々は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') 
3

もう1つの答えは、楕円をプロットする方法を示していますes。しかし、それらは一般的な楕円方程式からは明らかではない。ここでは、最初から始めます。数学的な導出を省略

は、次の式からセンターに解決する必要があります。

enter image description here

enter image description here

(おっと: "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関数です

  1. を方程式が楕円ではなく、何かであることを確実にするためのパラメータa, b, ..., fのための条件があります。 else(放物線と言う)。したがって、テストするために任意のパラメータ値を渡さないでください。実際には、方程式からこのような要件をおおよそ見ることができます。たとえば、行列Aは正の値でなければなりません。したがって、a > 0det(A) > 0です。また、r^2 > 0
  2. 私はコレスキー分解を使用しましたが、これは私のお気に入りです。しかし、最も美しい結果はEigen分解に由来します。私はこの部分をさらに追求しません。あなたがそれに興味があるなら、私の別の答えObtain vertices of the ellipse on an ellipse covariance plot (created by car::ellipse)を読んでください。コレスキー分解と固有分解の幾何学を説明する美しい図があります。
+0

偉大な答え!質問:どのように元の質問に 'f'パラメータがありましたが、あなたの解決策はありませんか?それは中止ですか? –

+0

私の悪いです。私は最初の行列方程式だけを見ました。 –

+0

したがって、正の確定性のチェックを追加すると、ユーザーが入力した任意のパラメータが楕円であれば問題ありません。 –

関連する問題