2016-05-04 9 views
-1

Я работаю над проблемой в C++, где мне нужно определить угол между строкой, представленной как 2 точки в координатах 3d (и т.д., x.y.z) и отключенной точкой. Вот несколько снимков, которые могут быть проще понять.Расчет угла между линией и точкой в ​​3D

This is in 2D to display it easier

Так что мне нужна помощь в поиске этот угол

With angle

Я искал в течение нескольких часов, чтобы решить эту проблему, и я подозреваю, что я просто пропустил что-то очевидное. Но если кто-нибудь может помочь мне с этим я буду очень признательна :)

+0

предполагает размещение картины непосредственно, а не ссылки на imgurl –

+1

Слышали ли вы о math.stackexchange.com? Это ты хочешь пойти. Пример: http://math.stackexchange.com/questions/413482/angle-between-different-rays-3d-line-segments-and-computing-their-angular-rela и http://math.stackexchange.com/ вопросы/463415/angle-between-two-3d-lines Здесь мы обсуждаем программирование. – 4386427

+1

Вычислительная геометрия - это серая область между математикой и программированием.Пожалуйста, сойдите с высокой лошади. –

ответ

-2

Пусть говорят, у вас есть А (х , у , г) В (х , у , г) С (х , у , г) и общая точка В. Таким образом, уравнение линии АВ становится: (x1-x2)i + (y1-y2)j + (z1-z2)k и что для нашей эры это: (x2-x3)i + (y2-y3)j + (z2-z3)k

Cos theta = (AB.BC)/(|AB|*|BC|)

Вот код

#include<iostream> 
#include<math.h> 
#define PI 3.14159265 
using namespace std; 
int main() 
{ 
    int x1,x2,x3,y1,y2,y3,z1,z2,z3; 
    cout<<"for the first\n"; 
    cin>>x1>>y1>>z1; 
    cout<<"\nfor the second\n"; 
    cin>>x2>>y2>>z2; 
    cout<<"\nfor the third\n"; 
    cin>>x3>>y3>>z3; 
    float dot_product = (x1-x2)*(x2-x3) + (y1-y2)*(y2-y3)+ (z1-z2)*(z2-z3); 
    float mod_denom1 = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2)); 
    float mod_denom2 = sqrt((x2-x3)*(x2-x3) + (y2-y3)*(y2-y3) + (z2-z3)*(z2-z3)); 
    float cosnum = (dot_product/((mod_denom1)*(mod_denom2))); 
    float cos = acos(cosnum)*180/PI; 
    cout<< cos; 
} 
+0

, только если кто-нибудь скажет мне, что случилось. –

+0

не определяйте 'PI' себя! Это уже в math.h, используйте 'M_PI' –

+0

, было бы также лучше использовать промежуточные значения, равные' x1-x2', 'x2-x3' и т. Д. - код, который у вас есть, очень подвержен копированию -пастевые ошибки. –

-1

Используйте Law of Cosines:

gamma = acos((asq + bsq - csq)/2/sqrt(asq*bsq)) 

где asq и bsq являются квадратами расстояния между вершиной и двумя другими точками, и csq является квадрат расстояния между этими двумя точками.

(рисунок из Wikipedia)

+0

Почему downvote? Это именно тот подход к использованию. OP по-прежнему необходимо вычислять 'asq',' bsq', 'csq' из исходных координат, но это довольно легко. –

2

У Вас есть 2 векторов, первый, связанные с линии в 3D и другой вектор, соединяющий конечную точку линии и точки в 3D.

Чтобы вычислить угол между theta 2 векторов, вы можете воспользоваться тем, что V1.V2 = |V1| x |V2| x consine(theta)

Вот фрагмент кода я скопировал из here, чтобы вычислить скалярное произведение.

#include<numeric>  

int main() { 
    double V1[] = {1, 2, 3}; // vector direction i.e. point P2 - point P1 
    double V2[] = {4, 5, 6}; // vector direction i.e. point P3 - point P2 

    std::cout << "The scalar product is: " 
       << std::inner_product(begin(V1), end(V1), begin(V2), 0.0); 

    // TODO: Get theta 

    return 0; 
} 

После того, как у вас есть скалярное произведение, разделить его на величины 2 векторов, а затем взять обратную consine, чтобы получить тета.

+0

idk кто downvoting. Не я. Этот подход также работает. –

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

  • Нет связанных вопросов^_^