Сфере с пользовательскими линиями сетки в R - PullRequest
0 голосов
/ 22 февраля 2019

Я хотел бы построить сферу в R с линиями сетки на поверхности, соответствующей равной площади сетки сферы, используя преобразование arcos.

Я экспериментировал с R packakge rgl и получил несколькосправка от: Построение точек на сфере в R

, которая строит линии сетки с равным интервалом в лат.

У меня есть функция ниже, которая возвращает фрейм данных точекэто точки пересечения линий сетки, которые я хочу, но не знаю, как действовать дальше.

plot_sphere <- function(theta_num,phi_num){

  theta <- seq(0,2*pi,(2*pi)/(theta_num))

  phi <-  seq(0,pi,pi/(phi_num))

  tmp <- seq(0,2*phi_num,2)/phi_num

  phi <- acos(1-tmp)

  tmp <- cbind(rep(seq(1,theta_num),each = phi_num),rep(seq(1,phi_num),times = theta_num))

  results <- as.data.frame(cbind(theta[tmp[,1]],phi[tmp[,2]]))
  names(results) <- c("theta","phi")

  results$x <- cos(results$theta)*sin(results$phi)
  results$y <- sin(results$theta)*sin(results$phi)
  results$z <- cos(results$phi)
  return(results)
}

sphere <- plot_sphere(10,10)

Может кто-нибудь помочь, в общем, я считаю, что с функциями rgl сложно работать.

1 Ответ

0 голосов
/ 25 февраля 2019

Если вы используете lines3d или plot3d(..., type="l"), вы получите график, соединяющий точки в вашем фрейме данных.Чтобы получить разрывы (вам не нужна одна длинная строка), добавьте строки, содержащие значения NA.

Код в вашей функции plot_sphere кажется действительно запутанным (вы вычисляете phi дважды, вам не нужноне генерировать векторы требуемой длины и т. д.), но эта функция на его основе работает:

function(theta_num,phi_num){

  theta0 <- seq(0,2*pi, len = theta_num)

  tmp <- seq(0, 2, len = phi_num)

  phi0 <- acos(1-tmp)

  i <- seq(1, (phi_num + 1)*theta_num) - 1

  theta <- theta0[i %/% (phi_num + 1) + 1]
  phi <- phi0[i %% (phi_num + 1) + 1]

  i <- seq(1, phi_num*(theta_num + 1)) - 1
  theta <- c(theta, theta0[i %% (theta_num + 1) + 1])
  phi <- c(phi, phi0[i %/% (theta_num + 1) + 1])

  results <- data.frame( x = cos(theta)*sin(phi),
                         y = sin(theta)*sin(phi),
                         z = cos(phi))
  lines3d(results)
}
...