4

我想获得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 个点?(蟒蛇解决方案)

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
4

3 回答 3

5

我们可以很简单地使用复数来实现这一点,但您需要使用正确的语法。一般来说,复数可以写成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))
于 2016-10-27T13:34:20.947 回答
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)

在此处输入图像描述

于 2016-10-27T07:53:20.287 回答
2

哟也可以尝试这个(并避免复杂的算术)在实平面上的单位圆上有点:

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

在此处输入图像描述

于 2016-10-27T08:08:22.907 回答