2017-01-24 1 views
0

타원 일반 식 :R에 일반 방정식이 주어진 타원을 그리는 방법?

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

enter image description here

+0

타원을 그릴 때 R에서 사용할 수있는 기능은 무엇입니까? 나는 그들의 주장에 관심이있다. – MBo

+0

R의 패키지 ** ellipse **가 도움이 될 수 있습니다. 이 링크를 통해 가보십시오 - https://cran.r-project.org/web/packages/ellipse/ellipse.pdf –

답변

2

우리의 parametric 식으로 시작할 수 ellipse (다음 하나는 위키 피 디아에서이다), 우리는 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. polar (parametric) 형태의 우리는 먼저 아래도에서 5 개 방정식을 사용하여 5 개 파라미터를 획득하기 위해 다음 식을 사용하여 행 cartesian 식 변환 (http://www.cs.cornell.edu/cv/OtherPdf/Ellipse.pdf 찍은 상세한 수학가 발견 될 수).

  2. 위와 같이 얻은 매개 변수를 사용하여 타원을 그립니다.

enter image description here

단계 (1) 우리는 (우리가 A,B,C,D,E,F을 알고) 다음 코드를 사용할 수있는 경우 :

: (2)를 사용하여 다음 코드 단계

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 

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

다른 답변은 타원을 그리는 방법을 보여줍니다. 타원을 그 중심 및 주요 도끼 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의 함수 방정식은 타원 뭔가보다는 있는지 확인하기 위해 매개 변수 a, b, ..., f 조건이 있습니다

  1. 그렇지 않으면 (포물선이라고). 따라서 테스트 할 임의의 매개 변수 값을 전달하지 마십시오. 사실, 방정식에서 대략 요구 사항을 볼 수 있습니다. 예를 들어 행렬 A은 양수 여야합니다. 따라서 a > 0det(A) > 0; 또한, r^2 > 0.
  2. 내가 제일 좋아하는 Cholesky 인수 분해를 사용했습니다. 그러나, 가장 아름다운 결과는 Eigen 분해로부터옵니다. 이 부분에 대해서는 더 이상 추구하지 않을 것입니다. 당신이 그것에 흥미가 있다면, 나의 또 다른 대답 Obtain vertices of the ellipse on an ellipse covariance plot (created by car::ellipse)을 읽으십시오. 콜레 스키 (Cholesky) 분해 및 고유 분해 (Eigen decomposition)의 기하학을 묘사하는 아름다운 그림이 있습니다.
+0

큰 답변! 질문 : 어떻게 원래 질문에 'f'매개 변수가 있었지만 솔루션은 그렇지 않은 것입니까? 떨어 졌습니까? –

+0

제 잘못입니다. 저는 첫 번째 행렬 방정식을 보았습니다. –

+0

그렇다면 확실한 정의에 대한 점검을 추가하면 사용자가 입력 한 임의의 매개 변수가 타원이면 괜찮은지 확인할 수 있습니다. –

관련 문제