2013-09-10 1 views
2

Я с помощью трассировки лучей, и в начале я предполагал плоскую поверхность таким образом, я использовал уравнение плоской поверхности, которая является:найти пересечение прямой с произвольной поверхностью?

Ax + BY + CZ +d = 0 

а А, В и С являются составной частью нормального вектора Plane Normal = [ABC] и с использованием уравнения Рейна: Ray = Source + t * Направление И затем решить его для t, и я могу найти точки пересечения.

Мой вопрос теперь, когда у меня есть функция в matlab для чтения поверхности объекта, но объект может быть не плоской поверхностью, и я получаю данные поверхности [XYZ] поверхности, но я не знаю, уравнение следует использовать для нахождения t, а затем точки пересечения. И у меня даже есть функция, чтобы дать мне нормальный вектор в каждой точке.

Если вы можете редактировать теги, то получите их, пожалуйста, сделайте это.

+0

Вы пробовали ['sym'] (http://www.mathworks.com/help/symbolic/sym.html)? –

+0

Нет, я не думаю, что мне это нужно – user2747076

+1

Я бы изменил название вопроса на что-то вроде «как найти пересечение линии с произвольной поверхностью?» –

ответ

-1

Если вы можете получить X Y Z поверхности, и вы сказали, что можете получить нормальный вектор в каждой точке, так что ваша проблема сейчас?

X Y Z поверхности являются точками пересечения, и если у вас есть нормальный вектор в каждой точке, чтобы вы могли рассчитать все, что вы хотите (отражение или преломленные лучи).

Я думаю, что у вас нет никаких проблем на всех

+0

Что делать, если точка находится на пересечении многих плоскостей, а первая производная не является непрерывной? Что тогда? – duffymo

0

Это может быть не плоскость, но вы всегда можете вычислить нормальный вектор в каждой точке. Вам просто нужно будет усердно работать, чтобы это сделать. Возьмем две частичные производные в плоских координатах, пересечь эти векторы, и это нормальная точка.

+0

+1, но позаботьтесь о коллинеарном корпусе. – Bathsheba

+0

У меня даже есть funcion, чтобы дать мне нормальный вектор в каждой точке, но у меня нет на мой взгляд ничего, как вычислить точки пересечения Не могли бы вы объяснить мне, как это сделать? – user2747076

+1

Частные производные всегда ортогональны в плоскости. – duffymo

0

Если поверхность определяется как высота Z на некотором X-Y сетки, вы можете решить эту проблему легко с помощью fzero. Это исключило бы некоторые сложные формы, но могло бы работать для стандартных проблем с оптикой, таких как луч, ударяющий по объективу. Предположим, что X, Y и Z представляют собой 2-мерные матрицы с одинаковой формой. Вы можете сделать 2d интерполяции, как

z_interp = interp2(X,Y,Z,x_interp,y_interp) 

Если это не так, то вы должны попытаться определить свою собственную функцию, которая может вычислить z на основе x и y.

Для линии, мы имеем

x_ray = x_source + t * x_dir 
y_ray = y_source + t * y_dir 
z_ray = z_source + t * z_dir 

Так теперь вы можете определить функцию, которая вычисляет высоту над поверхностью в зависимости от t как

height_above_plane = @(t) z_source + t * z_dir - interp2(X, Y, Z, ... 
    x_source + t*x_dir, y_source + t*y_dir) 

Заметим, что это не может быть кратчайшее расстояние от точки до плоскости, это только высота, измеренная вдоль z-направления. Время, когда луч попадает на поверхность, теперь можно найти, ища t, для которого высота равна нулю. Это может быть сделано для произвольных функций с помощью fzero:

t_intercept = fzero(height_above_plane, 0); 

Это должно работать хорошо для простых случаев, когда функция, определяющая поверхность относительно гладкая и луч пересекает поверхность только один раз. Возможно, в такой простой случай можно преобразовать случаи с более сложной геометрией.