0

次のように定義された円があるとします。

X^2 + Y^2 = r^2

円の原点は0radius = 1です。原点から座標とともに右に移動する水平線を引く(x1,y1)=(0,0)と、(x2,y2) = (2,0)この線は円と交差するはずです。例えば

library(plotrix)
plot(0,0,xlim=c(-3,3),ylim=c(-2,2))
draw.circle(0,0,1)
lines(c(0,2),c(0,0))

ここに画像の説明を入力

線と円の交点を見つけようとしましたが、うまくいきませんでした。このwolfram ページからアプローチして、次のコードを作成しましたが、正しい結果が得られないようです。誰かが私の(間違いなく)愚かな間違いを指摘してもらえますか?

r <- 1
id <- 1:5
x1 <- c(0)
y1 <- c(0)
x2 <- c(2)
y2 <- c(0)
df <- data.frame(id,x1,y1,x2,y2)

df <- transform(df, dx = x2-x1)
df <- transform(df, dy = y2-y1)
df <- transform(df, dr = sqrt(dx^2+dy^2))
df <- transform(df, D  = (x1*y2)-(x2*y1))
df <- transform(df, dysign = sapply(dy,function(x) ifelse(x < 0,-1,1)))
df <- transform(df, newxplus = (D*dy + (dysign*dy) *dx*sqrt(r^2*dr^2-D^2))/dr^2)
df <- transform(df, newxneg  = (D*dy - (dysign*dy) *dx*sqrt(r^2*dr^2-D^2))/dr^2)
df <- transform(df, newyplus = (-D*dx + (abs(dy)) *sqrt(r^2*dr^2-D^2))/dr^2)
df <- transform(df, newyneg  = (-D*dx - (abs(dy)) *sqrt(r^2*dr^2-D^2))/dr^2)

# where newxplus and newxneg are the two x coordinates for the two possible intercepts
# similarly for newyplus and newyneg
df
4

1 に答える 1

4

newxplus、およびの計算でタイプミスをしましたnewxneg

sgn*(dy)リンクしたwolfram ページの表記は、値にsgn* 適用される関数dy、つまり列dysignであり、 を掛けた列ではありませんdysign dy

それで:

# df <- transform(df, newxplus = (D*dy + (dysign*dy)*dx*sqrt(r^2*dr^2-D^2))/dr^2)
df <- transform(df, newxplus = (D*dy + dysign*dx*sqrt(r^2*dr^2-D^2))/dr^2)
# df <- transform(df, newxneg  = (D*dy - (dysign*dy)*dx*sqrt(r^2*dr^2-D^2))/dr^2)
df <- transform(df, newxneg  = (D*dy - dysign*dx*sqrt(r^2*dr^2-D^2))/dr^2)

-1 と +1 の切片の x 座標を指定します。

リンクしたページは無限の線と円の交点のためのものであり、これが 2 つの交点を取得した理由ですが、後で線の x/y 制限を出力交点に適用して、必要な交点をフィルタリングすることができます。有限線を使用しています。

また、実際には今のところデータフレームのみを使用していると述べていますが(5行は常に同じであることに注意してください...)、この関数の完全なバージョンを作成するときは、値を事前に計算することをお勧めしますsqrt(r^2 * dr^2 - D^2)。 x座標とy座標の両方を計算するために使用されます。

于 2012-11-08T00:17:01.423 に答える