Вот один способ сделать это, если вы хотите сделать математику самостоятельно: Пересечь линию с каждой из 6 плоскостей, созданных ограничительной рамкой.
Векторное представление линии: X = B + t * D, где B - это кортеж (x, y, z) базовой точки (скажем, вашей первой точки), а D - направление линии, снова выражается в виде кортежа (dx, dy, dz). Вы получаете направление, вычитая одну из точек из другой, поэтому, если у вас есть точки P1 (x1, y1, z1) и P2 (x2, y2, z2), то D = P2 - P1 и B = P1, что означает D = (x2 - x1, y2-y1, z2-z1). Мы назовем элементы этого вектора dx, dy и dz.
Параметрическое представление плоскости: x + y + z = c. Итак, преобразуйте вашу ограничивающую рамку в это представление, а затем используйте параметрическое представление вашей линии, например, три уравнения x = x1 + t dx, y = y1 + t dy, z = y1 + t * dz, чтобы заменить x, y и z в вашем уравнении плоскости. Решить за т. Поскольку каждая из ваших 6 плоскостей будет параллельна плоскости, созданной двумя осями, ваша задача станет проще; например, для плоскости, параллельной плоскости, созданной осями x и y, уравнение плоскости просто становится z = c, тогда как c является координатой z одной из точек вашей ограничительной рамки и так далее.
Теперь используйте t для вычисления точки пересечения линии с вашей плоскостью. (Если t <0 или> 1, то ваша линия пересекает ВНЕ P1-P2, если t> = 0 и t <= 1, тогда ваша линия пересекает плоскость где-то между P1 и P2) </p>
Теперь вы еще не закончили. Уравнение плоскости дает вам плоскость, а не прямоугольник, поэтому точка пересечения с плоскостью может фактически быть за пределами вашего прямоугольника, но поскольку теперь у вас есть координаты пересечения (x = x1 + t * dx и т. Д.), Вы можете легко увидеть, находится ли эта точка внутри прямоугольника вашей ограничительной рамки. Ваша задача теперь сводится к тому, чтобы проверить, находится ли точка в 2D-пространстве внутри ограничивающего прямоугольника, что тривиально проверить.
Конечно, первое, что вы должны сделать, если вы на самом деле используете это решение, это проверить, выровнена ли линия вдоль одной оси, потому что в этом случае ваш код пересечения станет тривиальным, и он также позаботится о проблеме линия, не пересекающая некоторые плоскости, например огромное или крошечное число т, может быть, даже переполнение или недостаточное количество.
Могу поспорить, есть более быстрые способы сделать это, но это сработает.