R: построение дуги между двумя 3d точками с помощью RGL - PullRequest
0 голосов
/ 11 октября 2018

Я создал 3d-сферу с rgl.spheres(), используя rgl, и нанес на нее две точки на поверхности сферы.Кто-нибудь знает, как провести дугу между этими двумя точками?

1 Ответ

0 голосов
/ 11 октября 2018

Вам нужно будет вычислить точки вдоль дуги и использовать lines3d, чтобы нарисовать кривую.Возможно, вы захотите немного переместить дугу за пределы сферы, чтобы избежать проблем, если они пересекаются: ни один из них не является сферическим, поэтому пересечения могут выглядеть уродливо.

Например,

r <- 1.3
center <- matrix(1:3, ncol=3)
library(rgl)
open3d()
spheres3d(center, radius = r, col = "white")
# A couple of random points
pts <- matrix(rnorm(6, mean=c(center, center)), ncol = 3)
# Set the radius to 1.001*r
setlen <- function(pt) {
  center + 1.001*r*(pt - center)/sqrt(sum((pt - center)^2))
}
pts <- t(apply(pts, 1, setlen))
points3d(pts, col = "black")

# Now draw the arc
n <- 20
frac <- seq(0, 1, len = n)
arc <- matrix(0, ncol = 3, nrow = n)
for (i in seq_along(frac)) {
  # First a segment
  arc[i,] <- frac[i]*pts[1,] + (1-frac[i])*pts[2,]
  # Now set the radius
  arc[i,] <- setlen(arc[i,])
}
lines3d(arc, col = "red")

Это производит

enter image description here

Отредактировано, чтобы добавить:

Самая последняя версия rgl (0.100.5, только в настоящее время доступна наR-forge) имеет новую функцию arc3d.В этой версии код для рисования изображения может быть упрощен до

library(rgl)
open3d()
spheres3d(center, radius = r, col = "white")
points3d(pts, col = "black")
arc3d(pts[1,], pts[2,], center, col = "red")

. Если точки находятся на разных расстояниях от center, он соединит их с дугой из логарифмической спирали вместо дуги окружности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...