2

Rで(固有値の代わりに)次の定義に基づいて単純な楕円を描く方法はありますか?

私が使用したい定義は、楕円は、2 つの固定点 F 1と F 2までの距離の合計が一定である平面内の点の集合であるということです。

極座標を使用する必要がありますか?

これはよりアルゴリズム的な質問かもしれません。

4

1 に答える 1

11

@DWinが示唆したように、楕円をプロットするためのいくつかの実装があります(draw.ellipseパッケージ内の関数などplotrix)。それらを見つけるには:

 RSiteSearch("ellipse", restrict="functions")

そうは言っても、ジオメトリを少し知っていれば、独自の関数を実装するのはかなり簡単です。ここに試みがあります:

ellipse <- function(xf1, yf1, xf2, yf2, k, new=TRUE,...){
    # xf1 and yf1 are the coordinates of your focus F1
    # xf2 and yf2 are the coordinates of your focus F2
    # k is your constant (sum of distances to F1 and F2 of any points on the ellipse)
    # new is a logical saying if the function needs to create a new plot or add an ellipse to an existing plot.
    # ... is any arguments you can pass to functions plot or lines (col, lwd, lty, etc.)
    t <- seq(0, 2*pi, by=pi/100)  # Change the by parameters to change resolution
    k/2 -> a  # Major axis
    xc <- (xf1+xf2)/2
    yc <- (yf1+yf2)/2  # Coordinates of the center
    dc <- sqrt((xf1-xf2)^2 + (yf1-yf2)^2)/2  # Distance of the foci to the center
    b <- sqrt(a^2 - dc^2)  # Minor axis
    phi <- atan(abs(yf1-yf2)/abs(xf1-xf2))  # Angle between the major axis and the x-axis
    xt <- xc + a*cos(t)*cos(phi) - b*sin(t)*sin(phi)
    yt <- yc + a*cos(t)*sin(phi) + b*sin(t)*cos(phi)
    if(new){ plot(xt,yt,type="l",...) }
    if(!new){ lines(xt,yt,...) }
    }

例:

F1 <- c(2,3)
F2 <- c(1,2)
plot(rbind(F1, F2), xlim=c(-1,5), ylim=c(-1, 5), pch=19)
abline(h=0, v=0, col="grey90")
ellipse(F1[1], F1[2], F2[1], F2[2], k=2, new=FALSE, col="red", lwd=2)
points((F1[1]+F2[1])/2, (F1[2]+F2[2])/2, pch=3)

ここに画像の説明を入力

于 2012-08-14T07:09:39.433 に答える