Расстояние точек внутри круга относительно центра - PullRequest
1 голос
/ 10 ноября 2019

У меня возникли небольшие трудности с вычислением расстояний между точками внутри круга относительно центра круга в R. После вычисления расстояний равномерно распределенных точек с помощью моей функции (полный пример см. Ниже), я затем подмножестводанные основаны на расстоянии отсечки. При построении графика результат не является однородным кольцом, как можно было бы интуитивно понять. Вместо этого в результате получается объект странной формы, который «почти» представляет собой кольцо, но зажат вдоль горизонтальной оси.

Возможно, мне здесь не хватает чего-то действительно очевидного, но я не могу понять, что это может быть.

library(dplyr)

set.seed(111)

# Generate a set of angles from a uniform distribution
theta <- runif(2500, 0, 2 * pi)

# Generate a set of radii from a uniform distribution 
radius <- sqrt(runif(2500))

# Assemble into a matrix of 2D coordinates
x <- radius * cos(theta)
y <- radius * sin(theta)
z <- cbind(x, y)

par(pty = "s") # square plot region
plot.diameter <- c(-1, 1) # plot boundaries
plot(z, pch = 20, cex = 0.20,
     col = rgb(red = 0, green = 0, blue = 0, alpha = 0.5),
     xlim = plot.diameter, ylim = plot.diameter)

enter image description here

# Radial distance function
# Computes the distance of all points within the circle to the circle center 
# Default center: (0, 0)
rad.dist <- function(m, x.center = 0, y.center = 0) {
  (m[, 1] - x.center) ^ 2 + (m[, 2] - y.center) ^ 2 %>%
    sqrt() -> d
  return(d)
}

z.radial <- rad.dist(z)

# Bind radial distance column to coordinates
z <- cbind(z[, 1], z[, 2], z.radial)

# Rename columns for convenience
colnames(z) <- c("x", "y", "rd")

# Subset based on radial distance
outer.ring <- subset(z, z[, 3] >= 0.75)

plot(outer.ring, pch = 20, cex = 0.20,
     col = rgb(red = 0, green = 0, blue = 0, alpha = 0.5),
     xlim = plot.diameter, ylim = plot.diameter)

enter image description here

Ответы [ 3 ]

2 голосов
/ 10 ноября 2019

Порядок операций в rad.dist() является основной проблемой. В частности, труба magrittr бросает вас за петлю. 1 + 2 %>% sqrt против (1 + 2) %>% sqrt.

rad.dist <- function(m, x.center = 0, y.center = 0) {
  sqrt((m[, 1] - x.center)^2 + (m[, 2] - y.center)^2)
}

outer.ring <- z[rad.dist(z) >= 0.75,]

plot(outer.ring, pch = 20, cex = 0.20,
     col = rgb(red = 0, green = 0, blue = 0, alpha = 0.5),
     xlim = plot.diameter, ylim = plot.diameter)
1 голос
/ 10 ноября 2019

%>% имеет более высокий порядок приоритета, чем +. Вам нужны круглые скобки вокруг вашего x^2 + y^2 перед каналом и sqrt.

> library(magrittr)     # or dplyr, or anywhere it's reexported
> 2+2 %>% sqrt()
[1] 3.414214
> (2+2) %>% sqrt()
[1] 2
> 2 + (2 %>% sqrt())
[1] 3.414214
1 голос
/ 10 ноября 2019

Это потому, что ваши точки неравномерно распределены по кругу.

Для генерации одинаковых точек по кругу (в более общем смысле, сферы) вы можете использовать пакет uniformly:

library(uniformly)

npoints <- 2500
z <- runif_in_sphere(npoints, d = 2, r = 1)

rad.dist <- function(m, x.center = 0, y.center = 0) {
  sqrt((m[, 1] - x.center) ^ 2 + (m[, 2] - y.center) ^ 2)
}
z.radial <- rad.dist(z)
# Bind radial distance column to coordinates
z <- cbind(z[, 1], z[, 2], z.radial)
# Rename columns for convenience
colnames(z) <- c("x", "y", "rd")
# Subset based on radial distance
outer.ring <- subset(z, z[, 3] >= 0.75)
# plot
par(pty = "s")
plot(outer.ring, pch = 20, cex = 0.20,
     col = rgb(red = 0, green = 0, blue = 0, alpha = 0.5),
     xlim = c(-1,1), ylim = c(-1,1))

enter image description here

Если ваша цель - получить единообразные точки в затрубном пространстве, вы можете напрямую сгенерировать их с помощью uniformly:

z <- runif_in_annulus(1000, c(0,0), 0.75, 1)
plot(z, pch = 20, cex = 0.20,
     col = rgb(red = 0, green = 0, blue = 0, alpha = 0.5),
     xlim = c(-1,1), ylim = c(-1,1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...