在R中圆上距离相等的n个点的坐标是什么?

5
我想获取在R中圆上等距离n个点的坐标。 数学解决方案是: exp((2*pi * i)*(k/n)) 其中 0 <= k < n
有许多SOF问题来处理这个问题。所有的解决方案都在非R环境中: 在球体上均匀分布n个点 (提供java、python解决方案) 生成圆上的点 (非R解决方案) 计算圆上8个等距点的像素坐标 (python解决方案) 在圆上均匀绘制点 (非R解决方案)

如何在R中绘制沿圆周的点(非等距)

圆周上每个点的坐标(非R解决方案)

在Pebble中将圆分为n个相等的部分的点的坐标

如何有效地在屏幕上绘制N个点?(python解决方案)

在圆上近似位置n个点(非R解决方案)

确定圆上的向量点

我的解决方案:

# 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
3个回答

6
我们可以很简单地使用复数来实现这一点,但需要使用正确的语法。一般而言,复数可写为ai + b(例如3i + 2)。如果只有虚部,我们可以只写ai。因此,虚数单位就是1i
Npoints = 20
points = exp(2i * pi * (1:Npoints)/Npoints)
plot(points)

enter image description here

如果出于任何原因,您需要从复数平面转换为笛卡尔平面,您可以使用 Re()Im() 提取实部和虚部。
points.Cartesian = data.frame(x=Re(points), y=Im(points))

我将 ...Npoints+1)[-1]) 更改为 ...Npoints+1)[-(Npoints+1)]),以完全匹配数学解决方案(0<=k<n)。上面的代码适用于(0<k<=n)。由于单位根是重复循环的,因此上述反映(0<k<=n)的代码也完美地完成了问题。此外,您的想法 1i 摆脱了我们对 sqrt(as.complex(-1)) 的依赖,这对我来说是非常新颖的。非常感谢。 - Erdogan CEVHER
那真的很棒。 - sebastian-c

4

您也可以尝试这个方法(避免复杂算术),在实数平面上有单位圆上的点:

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

enter image description here


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

enter image description here


f(0/4)=0+0i 是原点,不在单位圆上。当我在你的f定义中将exp(2*pi*i)*x更改为exp((2*pi*i)*x)时,它起作用了。 - Erdogan CEVHER
1
抱歉,在去掉括号时我犯了个错误。我会修复的。 - sebastian-c
从功能上讲,sebastian-c的答案是正确的,因为它包括了复坐标(例如,(0,i))。另一方面,sandipan的答案是实用的,因为它隔离了复坐标并呈现了没有i的(x,y)数值。由于我无法决定接受哪一个作为答案,所以我选择了sandipan的。顺便说一下,非常感谢sebastian,因为他教会了我as.complex(-1) - Erdogan CEVHER
1
更简单的方法是使用1i。不需要去处理as.complexsqrt(-1) - dww
@dww 我知道有这样的东西,但忘了去找它,谢谢! - sebastian-c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接