直线和圆之间的截距

时间:2012-11-07 23:57:40

标签: r math

想象一下,我们有一个由以下定义的圆圈:

X^2 + Y^2 = r^2

圈子的来源是0radius = 1。如果我们从坐标(x1,y1)=(0,0)(x2,y2) = (2,0)向右移动的原点绘制一条水平线,则此线应与圆相交。 e.g。

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

enter image description here

我试图找到线与圆的交叉但没有运气。我拿了 我从这个wolfram page的方法生成以下代码,但它似乎没有产生正确的结果。有人可以指点我的(毫无疑问)愚蠢的错误吗?

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

1 个答案:

答案 0 :(得分:4)

您在计算newxplusnewxneg时犯了错字。

wolfram page you linked上的符号sgn*(dy)是函数sgn* 已应用到值dy,即您的列dysigndysign 乘以<{em} 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坐标。

请注意,您链接的页面是无限线与圆的交点,这就是您有两个交点的原因,但您可以稍后将线的x / y限制应用于如果您使用有限行,则输出交叉点以过滤您想要的那些。

另外你提到你现在只在实践中使用数据帧(请注意,你拥有的5行总是相同的...),但是当你编写这个函数的完整版本时,我建议你预先计算值sqrt(r^2 * dr^2 - D^2),因为它用于计算x和y坐标。