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)