2016-11-05 5 views
0

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

Я проверил это с несколькими примерами, и я уверен, что соглашение будет работать во всех случаях. Я также очень уверен, что это будет полезно для многих людей. Тем не менее, проблема с прослушиванием для меня заключается в том, как программировать это. Любые советы/помощь/предложения будут очень оценены. Благодаря!

+0

Можете ли вы дать выход по сравнению с ожидаемым выходом? –

ответ

0

Две плоскости образуют две пары углов (a, Pi-a, a, Pi-a). Конечно, все они правильные. И подход с апроксином дает один из этих углов в диапазоне 0..Pi.

Если у вас есть ориентированных плоскости, определяется нормальными направлениями, вы можете вычислить угол в диапазоне между -Pi..Pi нормальных направлениями с использованием функции:

Angle = atan2(vectorproduct(normal1, normal2), dot(normal1, normal2)) 

Обратите внимание, что знак этого угла зависит от того, нормальных векторов!

Delphi пример для 2D-данных дает

angle -45.00 
angle 116.57 

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

var 
    an, v1x, v1y, v2x, v2y: Double; 
begin 
    v1x := 1; 
    v1y := 0; 
    v2x := 1; 
    v2y := -1; 
    an := RadToDeg(ArcTan2(v1x * v2y - v2x * v1y, v1x * v2x + v1y * v2y)); 
    Memo1.Lines.Add(Format('angle %5.2f', [an])); 
    v1x := 1; 
    v1y := -0.5; 
    v2x := 0; 
    v2y := 5; 
    an := RadToDeg(ArcTan2(v1x * v2y - v2x * v1y, v1x * v2x + v1y * v2y)); 
    Memo1.Lines.Add(Format('angle %5.2f', [an])); 
+0

@Eli Sadoff: первый ответ - 45 град. тогда как второе должно быть 63,4349 град., но возвращает 116,5651 – User110

+0

спасибо за ваш комментарий @MBo, но затем он все же возвращает те же 45 град и 116,5651 град. соответственно. Я знаю, что могу легко вычесть 116.5651 из 180, чтобы получить правильный результат. Однако, что, если кто-то должен был использовать мой код? – User110

+0

Спасибо @ МБо. Очевидно, это не код Matlab, и хотя я могу воспроизвести большую часть его в Matlab, за исключением последней строки (и ее аналога в строке 9), я все равно получаю те же ответы, что и в моем коде. Пожалуйста, я что-то пропустил здесь? – User110

Смежные вопросы