Я не знаю, каков стандартный способ сделать это, но если вы хотите знать только, если он пересекается, вот что я бы сделал.
Общее правило ... избегайте выполнения sqrt () или других дорогостоящих операций. По возможности разберитесь с квадратом радиуса.
- Определите, находится ли начальная точка внутри радиуса сферы. Если вы знаете, что это никогда не так, пропустите этот шаг. Если вы внутри, ваш луч пересечет сферу.
С этого момента ваша отправная точка находится за пределами сферы.
- Теперь представьте маленькую коробочку, которая будет соответствовать сфере. Если вы находитесь за пределами этого поля, проверьте направление x, y и z луча, чтобы увидеть, будет ли он пересекать сторону бокса, с которой начинается ваш луч. Это должна быть простая проверка знака или сравнение с нулем. Если вы находитесь снаружи и удаляетесь от него, вы никогда не пересечете его.
С этого момента вы находитесь в более сложной фазе. Ваша отправная точка находится между воображаемой коробкой и сферой. Вы можете получить упрощенное выражение, используя исчисление и геометрию.
Суть того, что вы хотите сделать, это определить, является ли кратчайшее расстояние между вашим лучом и сферой меньше радиуса сферы.
Пусть ваш луч будет представлен как (x0 + i t, y0 + j t, z0 + k t), а центр вашей сферы будет в (xS, yS, zS) , Итак, мы хотим найти t таким, чтобы оно давало наименьшее из (xS - x0 - i t, yS - y0 - j t, zS - z0 - k t).
Пусть x = xS - x0, y = yX - y0, z = zS - z0, D = величина квадрата вектора
D = x ^ 2 -2 * x i t + (i * t) ^ 2 + y ^ 2 - 2 * y j t + (j * t) ^ 2 + z ^ 2 - 2 * z k t + (k * t) ^ 2
D = (i ^ 2 + j ^ 2 + k ^ 2) t ^ 2 - (x i + y j + z k) * 2 * t + ( x ^ 2 + y ^ 2 + z ^ 2)
dD / dt = 0 = 2 * t * (i ^ 2 + j ^ 2 + k ^ 2) - 2 * (x i + y j + z * k)
t = (x i + y j + z * k) / (i ^ 2 + j ^ 2 + k ^ 2)
Вставьте t обратно в уравнение для D = .... Если результат меньше или равен квадрату радиуса сферы, у вас есть пересечение. Если оно больше, то пересечения нет.