Хорошо, вектор оси цилиндра U = B - A = (x2-x1, y2-y1, z2-z1); разделите на его величину, и вы получите вектор u = U / | U | единичной длины. Это легкая часть.
Два других ортогональных вектора произвольны, и существует множество способов их определения. Вот простой:
- Выберите случайный вектор r1.
- Вычислить часть r1, которая является , а не в направлении u: r2 = r1 - (r1. U) u; этот вектор перпендикулярен u, потому что r2. и = г1. u - (r1. u) * (u.u) = 0
- Если величина r2 мала (скажем, меньше 0,1), вернитесь к шагу 1.
- Вычислить v = r2 / | r2 |. Он имеет единичную длину и перпендикулярен u.
- Вычислить w = u x v. Он имеет единичную длину и перпендикулярен u и v.
В общем, я не думаю, что есть какой-либо способ детерминистически избежать попытки использовать более одного вектора, перпендикулярного u. Если вы хотите использовать фиксированную матрицу преобразования координат M для генерации r1 = Mu, всегда есть вероятность, что r1 очень близко к u в направлении. (а линейные операции, такие как замена компонентов x и y вектора или вычисление x '= y, y' = -x, могут быть записаны как преобразования координат.)