I want to get the coordinates of the equally distanced n points on a circle in R.
Mathematically the solution is: exp((2*pi * i)*(k/n)) where 0 <= k < n
There are many SOF questions to handle this problem. All the solutions are in non-R environments:
Evenly distributing n points on a sphere (java, python solutions presented)
Generating points on a circle (non-R solution)
calculate pixel coordinates for 8 equidistant points on a circle (python solution)
drawing points evenly distributed on a circle (non-R solution)
How to plot points around a circle in R (no equally distancing)
Coordinates of every point on a circle's circumference (non-R solution)
Coordinates of points dividing circle into n equal halves in Pebble
How to efficiently draw exactly N points on screen? (python solution)
Approximate position on circle for n points (non-R solution)
Determining Vector points on a circle
What I did for solution:
# 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))
Complex number i is not defined in R. There is no such constant as opposite to pi (3.14). The trick sqrt(-1) to similate i does not work; the error:
[1] NaN
Warning message: In sqrt(-1) : NaNs produced
we can use complex numbers to achieve this quite simply, but you need to use the correct syntax. in general, complex numbers can be written as ai + b
(e.g. 3i + 2
). If there is only an imaginary component, we can write just ai
. So, imaginary one is simply 1i
.
Npoints = 20
points = exp(2i * pi * (1:Npoints)/Npoints)
plot(points)
If, for any reason, you need to translate from a complex to a Cartesian plane, you can extract the real and imaginary components using Re()
and Im()
.
points.Cartesian = data.frame(x=Re(points), y=Im(points))
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
Having said that, couldn't you find equally spaced points on a circle without resorting to complex numbers?
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With