Векторные диаграммы rgl: показывать прямые углы для ортогональных векторов

В пакете matlib, https://github.com/friendly/matlib/, у меня есть функция, vectors3d() для рисования геометрических векторных диаграмм.

В следующем коде приведен пример рисунка, показывающего единичный вектор «J» и некоторые его проекции на оси X, Y, Z. В вызовах segments3d каждый аргумент представляет собой матрицу 2 x 3, задающую координаты начала/конца.

if (!require(matlib)) devtools::install_github(friendly/matlib)
library(matlib)
library(rgl)

vec <- rbind(diag(3), c(1,1,1))
rownames(vec) <- c("X", "Y", "Z", "J")
open3d()
vectors3d(vec, col=c(rep("black",3), "red"), lwd=2)
# draw the XZ plane, whose equation is Z=0
planes3d(0, 0, 1, 0, col="gray", alpha=0.2)
# show projections of the unit vector J
segments3d(v1 <- rbind( c(1,1,1), c(1, 1, 0)))
segments3d(v2 <- rbind( c(0,0,0), c(1, 1, 0)))
segments3d(v3 <- rbind( c(1,0,0), c(1, 1, 0)))
segments3d(v4 <- rbind( c(0,1,0), c(1, 1, 0)))

демонстрация 3D-векторов

Я хочу добавить к этому линии под прямым углом, например |_, чтобы показать, что пары векторов, построенные с помощью segments3d, ортогональны. Я нарисовал их вручную на следующем рисунке. Но я не знаю, как вычислить маленькие отрезки, необходимые для данной пары векторов в такой форме, скажем, v1 и v2. Я готов предположить, что каждая длина сегментов |_ представляет собой небольшое число, например 0,05. векторы 3D demo2

РЕДАКТИРОВАТЬ: Проблема сводится к следующему: учитывая три точки, p1, p2, p3, найдите точки, обозначенные p21, p23 и p123 на диаграмме ниже. Первые два являются простыми примерами поиска точки вдоль линии между двумя точками, но я застрял в поиске координат третьей точки, p123, то есть положения точки на расстоянии d вдоль линии, параллельной линии p2->p3 начиная с p21.

vector3d-диаграмма

В R то, что у меня есть до сих пор,

#' Find position of a point along a line from x1 to x2
point_on_line <- function(x1, x2, d, absolute=TRUE) {
    v <- x2 - x1
    if (!absolute) v <- v / len(v)
    x1 + d * v
}

p1 <- c(0,0,0)
p2 <- c(1,1,0)
p3 <- c(1,1,1)

(p21 <- point_on_line(p2, p1, .10))
(p23 <- point_on_line(p2, p3, .10))
points3d(rbind(p21, p23), size=10, col="red")

Это дает мне следующую диаграмму. Может ли кто-нибудь помочь мне завершить его?

введите здесь описание изображения


person user101089    schedule 09.12.2015    source источник
comment
Я получил приемлемый ответ на этот вопрос на Math Stackexchange, math.stackexchange.com/questions/1569612/   -  person user101089    schedule 11.12.2015