5点で決まる楕円
楕円の式は、
ただし、
のように、2次曲線の式で表されます。
この式の係数は6つですが、楕円の周上の5点の座標値から、楕円の式の係数を決定できます。
式に任意の定数を乗じても同じ楕円を描くので、同じ楕円を描く式は無数にあります。したがって、定数項 F は任意の値で良く、例えば、F=-1 として他の5つの係数を求めて良いということです。
に、5点の座標値を代入して5つの式を作成し連立方程式を解きます。
- EllipseCoeff <- function(x, y){
- x <- x[1:5]; y <- y[1:5]
- M <- matrix(c(x^2,x*y,y^2,x,y),5,5)
- u <- solve(M,c(1,1,1,1,1))
- list(A=u[1],B=u[2],C=u[3],D=u[4],E=u[5],F=-1)
- }
|
|
- plot(0,0,pch=20,xlim=c(-5,5),ylim=c(-3,3),
- xlab="x",ylab="y")
- abline(v=c(-4,0,4,2),h=c(-2,0,2,sqrt(3)),
- col=c("gray60","black","gray60","gray60"))
- abline(a=0,b=sqrt(3)/2,col="gray60")
- a <- 4; b <- 2 # 楕円の半径
- t <- seq(0,2*pi,length.out=361) # 媒介変数
- x <- a*cos(t); y <- b*sin(t) # 1°刻みの座標値
- lines(x,y) # 基本の楕円の描画
- # 媒介変数0,90,180,270°の4点と、60°の5点
- I <- c(0,90,180,270,60)+1
- points(x[I],y[I],pch=16,col="red")
|
|
上の図は、x軸半径 4、y軸半径 2 の楕円です。式では、
あるいは、64を乗じて、
などと表されます。
上のスクリプトでは、楕円は媒介変数 t を1° 刻みに採って、0°、90°、180°、270° の4点と、60°の点を合わせて5点に赤丸を描いています。
この5点の座標値から、楕円の式を求めると以下のようになります。
- r$> u <- EllipseCoeff(x[I],y[I])
- r$> str(u)
- List of 6
- $ A: num 0.0625
- $ B: num 0
- $ C: num 0.25
- $ D: num 7.24e-33
- $ E: num 2.78e-17
- $ F: num -1
|
なので、64を乗じれば、上述の、
となります。
この楕円を30°反時計回りに回転し、x軸方向に √3 、y軸方向に 2 平行移動します。
- plot(0,0,pch=20,xlim=c(-5,6),ylim=c(-3,5),xlab="x",ylab="y")
- abline(v=0,h=0)
- a <- 4; b <- 2 # 楕円の半径
- t <- seq(0,2*pi,length.out=361) # 媒介変数
- x <- a*cos(t); y <- b*sin(t) # 1°刻みの座標値
- lines(x,y) # 基本の楕円の描画
- # 媒介変数0,90,180,270°の4点と、60°の5点
- I <- c(0,90,180,270,60)+1
- points(x[I],y[I],pch=16,col="red")
- # 反時計回りに 30° 回転
- cs <- cos(pi/6); sn <- sin(pi/6)
- xy <- rbind(c(cs,-sn),c(sn,cs)) %*% rbind(x,y)
- lines(xy[1,],xy[2,],col="cyan") # 30° 回転した楕円の描画
- points(xy[1,I],xy[2,I],pch=16,col="green") # その5点
- # 平行移動
- x2 <- xy[1,]+sqrt(3); y2 <- xy[2,]+2
- lines(x2,y2,lwd=2) # 回転、平行移動した楕円の描画
- points(x2[I],y2[I],pch=16,col="blue") # その5点
|
| 5点の座標値は、以下のような値です。 - r$> round(x2[I],3);round(y2[I],3)
- [1] 5.196 0.732 -1.732 2.732 2.598
- [1] 4.000 3.732 0.000 0.268 4.500
|
元の楕円の周上の点を(x, y)、回転、平行移動した楕円の周上の点を (x’, y’) とすると、 なので、 |
x | y | => | x’ | y’ | 4 | 0 |
| 3√3 | 4 | 0 | 2 | √3-1 | √3+2 | -4 | 0 | -√3 | 0 | 0 | -2 | √3+1 | 2-√3 | 2 | √3 | 3√3/2 | 9/2 |
|
- r$> u <- EllipseCoeff(x2[I],y2[I])
- str(u)
- List of 6
- $ A: num 0.259
- $ B: num -0.385
- $ C: num 0.481
- $ D: num -0.128
- $ E: num -1.26
- $ F: num -1
|
|
mxima で連立方程式を作って解くと以下のようになります。
5点を通る楕円は、
となります。あるいは、27を乗じた、
と表せます。