Вам нужно будет вычислить точки вдоль дуги и использовать 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")
Это производит
Отредактировано, чтобы добавить:
Самая последняя версия 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
, он соединит их с дугой из логарифмической спирали вместо дуги окружности.