Хороший ответ Майка. Для любой сложной фигуры лучше всего найти матрицу преобразования T, которая отображает ее в хорошую вертикальную версию, в данном случае прямой цилиндр с радиусом 1. высота 1, хорошо бы справился с этой задачей. Разберитесь с новой строкой в этом новом пространстве, выполните расчет, конвертируйте обратно.
Однако, если вы хотите оптимизировать (и это звучит так, как вы), вероятно, есть нагрузки, которые вы можете сделать.
Например, вы можете рассчитать кратчайшее расстояние между двумя линиями - возможно, используя правило точечного произведения - представьте, что вы объединяете две строки в один поток. Тогда, если этот поток является самым коротким из всех возможных потоков, то он будет перпендикулярен обеим линиям, поэтому Thread.LineA = Thread.LineB = 0
Если кратчайшее расстояние больше радиуса цилиндра, то это промах.
Вы можете определить местоположение цилиндра, используя x, y, z, и вычеркнуть все это как какое-то ужасное квадратное уравнение, и оптимизировать, вычислив сначала дискриминант и вернув нулевой удар, если он отрицательный.
Чтобы определить местоположение, возьмите любую точку P = (x, y, z). опустите его как перпендикуляр к центральной линии вашего цилиндра и посмотрите на его величину в квадрате. если это равно R ^ 2, то точка находится в.
Затем вы добавляете свою строку {s = U + lamda * V} в этот беспорядок, и у вас получится какой-то неприятный квадратик в lamda. но это, вероятно, будет быстрее, чем возиться с матрицей, если только вы не можете заставить аппаратное обеспечение сделать это (я предполагаю, что OpenGL имеет некоторую функцию, чтобы заставить аппаратное обеспечение делать это сверхбыстрым).
Все зависит от того, сколько оптимизации вы хотите; лично я согласился бы с ответом Майка, если бы не было действительно веской причины не делать этого.
PS. Вы можете получить больше помощи, если объясните, какую методику вы используете, а не просто выводите код, оставив читателю возможность выяснить, что вы делаете.