А число может получиться отрицательным? Да легко, если у вас присутствуют и сложения и вычитания.
Не, отрицательным не может - там везде, где берется корень, он берется из суммы квадратов. А вот насчет того, может ли оказаться равным нулю... Думаю, что тоже вряд ли. Не могут оказаться равными нулю одновременно все компоненты вектора нормали.
А чего, структура --- это реально нужно?
Не знаю, если честно :) Это у меня после С++, наверное, удобно, когда есть объект и у него поля (характеристики)..
12d3, спасибо за совет, да, это наверняка упростит дело, сейчас попробую!
Вообще, если поставить не до 232 цикл, а меньше, то оно считает. И даже выдает значения, и, возможно, верные. Просто очень уж долго.
И еще, упрощение вычисления нормали. Нормаль (ненормированная) - это будет векторное произведение
, с точностью до знака (это смотря в каком порядке вы обходите точки). То есть, вам нужно вычислить всего одну компоненту векторного произведения и определить, положительна она или отрицательна.
То есть... В принципе -да, направления по Х и Y меня не интересуют, но нормировать нужно - мне ведь в конечном итоге нужен косинус угла между этой нормалью и осью Z. Причем нужен только в тех случаях, когда он положителен, то есть при углах от 0 до
. Кстати, может быть, по этому критерию тоже можно сократить часть циклов?
Пока программа выглядит вот так
m = 1;
for i1 = 1:29
for i2 = 20:50
R12 = ((Hy(i1).X-Hy(i2).X)^2 + (Hy(i1).Y-Hy(i2).Y)^2 + (Hy(i1).Z-Hy(i2).Z)^2)^0.5;
if R12 >10
for i3 = (i2+1):60
R23 = ((Hy(i2).X-Hy(i3).X)^2 + (Hy(i2).Y-Hy(i3).Y)^2 + (Hy(i2).Z-Hy(i3).Z)^2)^0.5;
R13 = ((Hy(i1).X-Hy(i3).X)^2 + (Hy(i1).Y-Hy(i3).Y)^2 + (Hy(i1).Z-Hy(i3).Z)^2)^0.5;
if R23 >10 && R13 >10
plane1 = Hy(i1).Y*(Hy(i2).Z - Hy(i3).Z) + Hy(i2).Y*(Hy(i3).Z - Hy(i1).Z) + Hy(i3).Y*(Hy(i1).Z - Hy(i2).Z) ;
plane2 = Hy(i1).Z*(Hy(i2).X - Hy(i3).X) + Hy(i2).Z*(Hy(i3).X - Hy(i1).X) + Hy(i3).Z*(Hy(i1).X - Hy(i2).X) ;
plane3 = Hy(i1).X*(Hy(i2).Y - Hy(i3).Y) + Hy(i2).X*(Hy(i3).Y - Hy(i1).Y) + Hy(i3).X*(Hy(i1).Y - Hy(i2).Y) ;
if plane3 > 0
cosin(m) = plane3/((plane1)^2 + (plane2)^2 + (plane3)^2)^0.5;
m = m+1;
end
end
end
end
end
Сейчас буду еще думать, как его улучшить.
А, да. Может, оно станет быстрее, если для R12 (и других двух расстояний) не считать их самих, а только квадраты и сравнивать с числом 100 ?