// This program calculates angle between three points in 3D. // // 3 points = A(Ax, Ay, Az), B(Bx, By, Bz), C(Cx, Cy, Cz) // To calculate angle ABC, // vector BA = (Ax-Bx, Ay-By, Az-Bz) // vector BC = (Cx-Bx, Cy-By, Cz-Bz) // The dot product of vector BA and BC is a function of the cosine of the angle ABC, i.e., it's scaled by the product of their magnitude. // So, // (1) normalize vector BA and BC with the product of their magnitude // (2) calculate the dot product // (3) recover the angle #include <stdio.h> #include <math.h> void main(void) { float Ax, Ay, Az, Bx, By, Bz, Cx, Cy, Cz; printf("\nThis program calculates angle of three points (ABC).\n"); printf("\nEnter 'x,y,z' of point A : "); scanf("%f,%f,%f", &Ax, &Ay, &Az); printf("Enter 'x,y,z' of point B : "); scanf("%f,%f,%f", &Bx, &By, &Bz); printf("Enter 'x,y,z' of point C : "); scanf("%f,%f,%f", &Cx, &Cy, &Cz); float vector_BA_x = Ax-Bx; float vector_BA_y = Ay-By; float vector_BA_z = Az-Bz; float vector_BC_x = Cx-Bx; float vector_BC_y = Cy-By; float vector_BC_z = Cz-Bz; float magnitude_BA = sqrt(vector_BA_x*vector_BA_x + vector_BA_y*vector_BA_y + vector_BA_z*vector_BA_z); float magnitude_BC = sqrt(vector_BC_x*vector_BC_x + vector_BC_y*vector_BC_y + vector_BC_z*vector_BC_z); // (1) normalize vector BA and BC with the product of their magnitude float normalized_BA_x = vector_BA_x / magnitude_BA; float normalized_BA_y = vector_BA_y / magnitude_BA; float normalized_BA_z = vector_BA_z / magnitude_BA; float normalized_BC_x = vector_BC_x / magnitude_BC; float normalized_BC_y = vector_BC_y / magnitude_BC; float normalized_BC_z = vector_BC_z / magnitude_BC; // (2) calculate the dot product float dot = normalized_BA_x * normalized_BC_x + normalized_BA_y * normalized_BC_y + normalized_BA_z * normalized_BC_z; // (3) recover the angle float angle = acos(dot); float angle_degree = angle * 180 / 3.14159265359; printf("\n\tAngle ABC = %.2f degrees\n", angle_degree); }
Aug 17, 2014
[C/C++] How to calculate angle between three points in 3D
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment