R 直线与圆的截距

R 直线与圆的截距,r,math,R,Math,假设我们有一个圆,由以下定义: X^2 + Y^2 = r^2 圆的原点是0和radius=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)) 我曾试图找到直线与圆的交点,但没有成功。我拿了 我的方法从这个角度出发,并产生以下代

假设我们有一个圆,由以下定义:

X^2 + Y^2 = r^2
圆的原点是
0
radius=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))

我曾试图找到直线与圆的交点,但没有成功。我拿了 我的方法从这个角度出发,并产生以下代码,但它似乎没有产生正确的结果。有人能指出我(毫无疑问)的愚蠢错误吗

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

r您在计算
newxplus
newxneg
时输入了一个错误

上的符号
sgn*(dy)
是应用于值
dy
的函数
sgn*
,即您的列
dysign
,而不是列
dysign
乘以
dy

因此:


#df您在计算
newxplus
newxneg
时输入了一个错误

上的符号
sgn*(dy)
是应用于值
dy
的函数
sgn*
,即您的列
dysign
,而不是列
dysign
乘以
dy

因此:


#df那么,你想要一个以原点为中心,半径为
r
的圆与原点水平线的交点??或以任意水平线为中心的任意圆??你是反对解析解(即精确解,通过公式而不是数字计算)还是一定要用R(因为这可以用数学和计算器来解决;不需要特别用R)?请澄清。任意圆和任意线。为了方便起见,我将原点居中。我选择水平线作为例子,因为我可以很容易地知道我应该期望的结果,这样我就可以测试我的代码/方法。好的,你有什么理由希望一切都在一个数据帧中吗?我特别兴奋于
r
中的快速解决方案,它可能会改进我的方法,即使我的错误在于简单的数学。数据帧方法允许我在进行时看到步骤的结果。然而,在实践中,我将有一个从
x
s和
y
s开始的数据帧,我将在
df
中生成具有相交坐标的新向量。因此,你想要一个以原点为中心的圆与半径
r
与原点的水平线的交点??或以任意水平线为中心的任意圆??你是反对解析解(即精确解,通过公式而不是数字计算)还是一定要用R(因为这可以用数学和计算器来解决;不需要特别用R)?请澄清。任意圆和任意线。为了方便起见,我将原点居中。我选择水平线作为例子,因为我可以很容易地知道我应该期望的结果,这样我就可以测试我的代码/方法。好的,你有什么理由希望一切都在一个数据帧中吗?我特别兴奋于
r
中的快速解决方案,它可能会改进我的方法,即使我的错误在于简单的数学。数据帧方法允许我在进行时看到步骤的结果。但是在实践中,我将有一个从
x
s和
y
s开始的数据帧,并且我将在
df
中生成具有相交坐标的新向量。非常感谢您的帮助。我误解了
sgn*(x)
表达式!。而预先计算
sqrt(r^2*dr^2-D^2)
肯定会带来更快的速度。非常感谢您的帮助。我误解了
sgn*(x)
表达式!。而预先计算
sqrt(r^2*dr^2-D^2)
肯定会带来更快的速度。
# 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)