R中圆上等距n个点的坐标?
Coordinates of equally distanced n points on a circle in R?
我想获取 R 中圆上等距 n 个点的坐标。
Mathematically the solution is:
exp((2*pi * i)*(k/n)) 其中 0 <= k < n
有很多SOF题可以解决这个问题。所有解决方案都在非 R 环境中:
Evenly distributing n points on a sphere(提供java、python解决方案)
(非 R 解决方案)
(python解)
drawing points evenly distributed on a circle(非 R 解决方案)
How to plot points around a circle in R(没有等距)
(非 R 解决方案)
(python解法)
(非 R 解决方案)
Determining Vector points on a circle
我的解决方案:
# For 4 points, 0<=k<4
exp((2*pi*sqrt(-1))*(0/4)); exp((2*pi*sqrt(-1))*(1/4)); exp((2*pi*sqrt(-1))*(2/4)); exp((2*pi*sqrt(-1))*(3/4))
复数i在R中没有定义。没有与pi (3.14)相反的常数。模拟 i 的技巧 sqrt(-1) 不起作用;错误:
[1] NaN
Warning message: In sqrt(-1) : NaNs produced
f <- function(x){
i <- sqrt(as.complex(-1))
exp(2*pi*i*x)
}
> f(0/4)
[1] 1+0i
> f(1/4)
[1] 0+1i
> f(2/4)
[1] -1+0i
> f(3/4)
[1] 0-1i
话说回来,不求助于复数就不能找到圆上等距的点吗?
eq_spacing <- function(n, r = 1){
polypoints <- seq(0, 2*pi, length.out=n+1)
polypoints <- polypoints[-length(polypoints)]
circx <- r * sin(polypoints)
circy <- r * cos(polypoints)
data.frame(x=circx, y=circy)
}
eq_spacing(4)
x y
1 0.000000e+00 1.000000e+00
2 1.000000e+00 6.123032e-17
3 1.224606e-16 -1.000000e+00
4 -1.000000e+00 -1.836910e-16
plot(eq_spacing(20), asp = 1)
你也可以尝试这个(并避免复杂的算术)在真实平面上的单位圆上有点:
n <- 50 # number of points you want on the unit circle
pts.circle <- t(sapply(1:n,function(r)c(cos(2*r*pi/n),sin(2*r*pi/n))))
plot(pts.circle, col='red', pch=19, xlab='x', ylab='y')
我们可以使用复数非常简单地实现这一点,但您需要使用正确的语法。一般来说,复数可以写成ai + b
(例如3i + 2
)。如果只有虚部,我们可以只写 ai
。所以,虚数就是 1i
.
Npoints = 10
points = exp(pi * 1i * seq(0, 2, length.out = Npoints+1)[-1])
plot(points)
如果出于任何原因需要将复数平面转换为笛卡尔平面,您可以使用 Re()
和 Im()
提取实部和虚部。
points.Cartesian = data.frame(x=Re(points), y=Im(points))
我想获取 R 中圆上等距 n 个点的坐标。
Mathematically the solution is: exp((2*pi * i)*(k/n)) 其中 0 <= k < n
有很多SOF题可以解决这个问题。所有解决方案都在非 R 环境中:
Evenly distributing n points on a sphere(提供java、python解决方案)
drawing points evenly distributed on a circle(非 R 解决方案)
How to plot points around a circle in R(没有等距)
Determining Vector points on a circle
我的解决方案:
# For 4 points, 0<=k<4
exp((2*pi*sqrt(-1))*(0/4)); exp((2*pi*sqrt(-1))*(1/4)); exp((2*pi*sqrt(-1))*(2/4)); exp((2*pi*sqrt(-1))*(3/4))
复数i在R中没有定义。没有与pi (3.14)相反的常数。模拟 i 的技巧 sqrt(-1) 不起作用;错误:
[1] NaN
Warning message: In sqrt(-1) : NaNs produced
f <- function(x){
i <- sqrt(as.complex(-1))
exp(2*pi*i*x)
}
> f(0/4)
[1] 1+0i
> f(1/4)
[1] 0+1i
> f(2/4)
[1] -1+0i
> f(3/4)
[1] 0-1i
话说回来,不求助于复数就不能找到圆上等距的点吗?
eq_spacing <- function(n, r = 1){
polypoints <- seq(0, 2*pi, length.out=n+1)
polypoints <- polypoints[-length(polypoints)]
circx <- r * sin(polypoints)
circy <- r * cos(polypoints)
data.frame(x=circx, y=circy)
}
eq_spacing(4)
x y
1 0.000000e+00 1.000000e+00
2 1.000000e+00 6.123032e-17
3 1.224606e-16 -1.000000e+00
4 -1.000000e+00 -1.836910e-16
plot(eq_spacing(20), asp = 1)
你也可以尝试这个(并避免复杂的算术)在真实平面上的单位圆上有点:
n <- 50 # number of points you want on the unit circle
pts.circle <- t(sapply(1:n,function(r)c(cos(2*r*pi/n),sin(2*r*pi/n))))
plot(pts.circle, col='red', pch=19, xlab='x', ylab='y')
我们可以使用复数非常简单地实现这一点,但您需要使用正确的语法。一般来说,复数可以写成ai + b
(例如3i + 2
)。如果只有虚部,我们可以只写 ai
。所以,虚数就是 1i
.
Npoints = 10
points = exp(pi * 1i * seq(0, 2, length.out = Npoints+1)[-1])
plot(points)
如果出于任何原因需要将复数平面转换为笛卡尔平面,您可以使用 Re()
和 Im()
提取实部和虚部。
points.Cartesian = data.frame(x=Re(points), y=Im(points))