enter image description here Хорошо документировано, что для нахождения угла пересечения между двумя плоскостями мы используем точечное произведение нормальных векторов, перпендикулярных каждой плоскости, которое затем дает косинус угла. Я попытался запрограммировать это, но понял, что в некоторых случаях расчет приводит к добавлению, а не к самому углу пересечения. Ниже приведены два примера коды ниже, что показывает, что это:Как получить правильный угол между двумя плоскостями?
x = linspace(-10,20, 12)
y1 = (0*x) + 9
y2 = -x + 19
figure
k = plotyy(x,y1, x,y2);
set(k(2),'YDir','reverse')
%vectors and normal vectors
n1 = [0, 1];
v1 = [1, 0];
n2 = [1, 1];
v2 = [1, -1];
angle = (acos(dot(v1, v2)/(norm(v1) * norm(v2))) * 180/pi)
вторая:
x = linspace(-10,10, 12);
y1 = -(0.5*x) + 1.333;
plot(x, y1); hold on
%2nd line
xd = 5;
plot(xd, x, 'o')
%vectors and normal vectors
n1 = [0.5, 1]; v1 = [1, -0.5];
n2 = [-5, 0]; v2 = [0, 5];
angle = (acos(dot(v1, v2)/(norm(v1) * norm(v2))) * 180/pi)
Обратите внимание, что первый пример вычисляет правильный угол (45 град), но 2-й пример вычисляет добавку (116,5651оС). После нескольких попыток взломать это я понял, что если одна нормаль указывает на положительную ориентацию и другие точки в отрицательной ориентации (см. Рис. А). Тогда: угол = 180 - (acos (точка (n1, n2)/(норма (v1) * norm (v2)))) * 180/pi. Однако, если оба n1 и n2 должны указывать в одном направлении (положительном или отрицательном), как на рис. B, то: угол = acos (точка (n1, n2)/(норма (v1) * norm (v2)))) * 180/pi
Я проверил это с несколькими примерами, и я уверен, что соглашение будет работать во всех случаях. Я также очень уверен, что это будет полезно для многих людей. Тем не менее, проблема с прослушиванием для меня заключается в том, как программировать это. Любые советы/помощь/предложения будут очень оценены. Благодаря!
Можете ли вы дать выход по сравнению с ожидаемым выходом? –