# Angle between a Pair of Lines in 3D

Given coordinates of three points A(x1, y1, z1), B(x2, y2, z2) and C(x3, y3, z3) in a 3D plane, where B is the intersection point of line AB and BC, the task is to find angle between lines AB and BC.

Examples:

Input: x1 = 1, y1 = 3, z1 = 3; x2 = 3, y2 = 4, z2 = 5; x3 = 5, y3 = 6, z3 = 9;
Output: 54.6065

Input: x1 = 10, y1 = 10, z1 = 10; x2 = 0, y2 = 0, z2 = 0; x3 = 15, y3 = 10, z3 = 15;
Output: 56.4496

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach:

1. Find the equation of lines AB and BC with the given coordinates in terms of direction ratios as:

AB = (x1 – x2)i + (y1 – y2)j + (z1 – z2)k
BC = (x3 – x2)i + (y3 – y2)j + (z3 – z2)k

2. Use the formula for cos Θ for the two direction ratios of lines AB and BC to find the cosine of the angle between lines AB and BC as:

where,
AB.BC is the dot product of direction ratios AB and BC.
|AB| is the magnitude of line AB
|BC| is the magnitude of line BC

Suppose there are two direction ratios:

A = ai + bj + ck
B = xi + yj + zk


then

Dot Product(A.B) = a*x + b*y + c*z
magnitude of A = |A| =
magnitude of B = |B| =

3. The cosine of the angle calculated gives the cosine value in radian. To find the angle multiply the cosine value by (180/Π).

Below is the implementation of the above approach:

## C++

 // C++ program for the above approach     #include "bits/stdc++.h"  #define PI 3.14  using namespace std;     // Function to find the angle between  // the two lines  void calculateAngle(      int x1, int y1, int z1,      int x2, int y2, int z2,      int x3, int y3, int z3)  {      // Find direction ratio of line AB      int ABx = x1 - x2;      int ABy = y1 - y2;      int ABz = z1 - z2;         // Find direction ratio of line BC      int BCx = x3 - x2;      int BCy = y3 - y2;      int BCz = z3 - z2;         // Find the dotProduct      // of lines AB & BC      double dotProduct          = ABx * BCx            + ABy * BCy            + ABz * BCz;         // Find magnitude of      // line AB and BC      double magnitudeAB          = ABx * ABx            + ABy * ABy            + ABz * ABz;      double magnitudeBC          = BCx * BCx            + BCy * BCy            + BCz * BCz;         // Find the cosine of      // the angle formed      // by line AB and BC      double angle = dotProduct;      angle /= sqrt(          magnitudeAB * magnitudeBC);         // Find angle in radian      angle = (angle * 180) / PI;         // Print the angle      cout << abs(angle) << endl;  }     // Driver Code  int main()  {         // Given coordinates      // Points A      int x1 = 1, y1 = 3, z1 = 3;         // Points B      int x2 = 3, y2 = 4, z2 = 5;         // Points C      int x3 = 5, y3 = 6, z3 = 9;         // Function Call      calculateAngle(x1, y1, z1,                     x2, y2, z2,                     x3, y3, z3);         return 0;  }

## Java

 // Java program for the above approach  import java.util.*;     class GFG{         // Function to find the angle   // between the two lines  static void calculateAngle(int x1, int y1, int z1,                             int x2, int y2, int z2,                             int x3, int y3, int z3)  {             // Find direction ratio of line AB      int ABx = x1 - x2;      int ABy = y1 - y2;      int ABz = z1 - z2;         // Find direction ratio of line BC      int BCx = x3 - x2;      int BCy = y3 - y2;      int BCz = z3 - z2;         // Find the dotProduct      // of lines AB & BC      double dotProduct = ABx * BCx +                          ABy * BCy +                           ABz * BCz;         // Find magnitude of      // line AB and BC      double magnitudeAB = ABx * ABx +                            ABy * ABy +                            ABz * ABz;      double magnitudeBC = BCx * BCx +                            BCy * BCy +                            BCz * BCz;         // Find the cosine of the       // angle formed by line      // AB and BC      double angle = dotProduct;      angle /= Math.sqrt(magnitudeAB * magnitudeBC);         // Find angle in radian      angle = (angle * 180) / 3.14;         // Print the angle      System.out.printf("%.4f", Math.abs(angle));  }     // Driver code  public static void main(String[] args)  {         // Given coordinates      // Points A      int x1 = 1, y1 = 3, z1 = 3;         // Points B      int x2 = 3, y2 = 4, z2 = 5;         // Points C      int x3 = 5, y3 = 6, z3 = 9;         // Function Call      calculateAngle(x1, y1, z1,                     x2, y2, z2,                     x3, y3, z3);  }  }     // This code is contributed by offbeat

## Python3

 # Python3 program for the above approach  import math     # Function to find the angle   # between the two lines  def calculateAngle(x1, y1, z1,                      x2, y2, z2,                     x3, y3, z3):                                # Find direction ratio of line AB      ABx = x1 - x2;      ABy = y1 - y2;      ABz = z1 - z2;         # Find direction ratio of line BC      BCx = x3 - x2;      BCy = y3 - y2;      BCz = z3 - z2;         # Find the dotProduct      # of lines AB & BC      dotProduct = (ABx * BCx +                    ABy * BCy +                    ABz * BCz);         # Find magnitude of      # line AB and BC      magnitudeAB = (ABx * ABx +                     ABy * ABy +                     ABz * ABz);      magnitudeBC = (BCx * BCx +                     BCy * BCy +                    BCz * BCz);         # Find the cosine of      # the angle formed      # by line AB and BC      angle = dotProduct;      angle /= math.sqrt(magnitudeAB *                         magnitudeBC);         # Find angle in radian      angle = (angle * 180) / 3.14;         # Print angle      print(round(abs(angle), 4))     # Driver Code  if __name__=='__main__':          # Given coordinates      # Points A      x1, y1, z1 = 1, 3, 3;         # Points B      x2, y2, z2 = 3, 4, 5;         # Points C      x3, y3, z3 = 5, 6, 9;          # Function Call      calculateAngle(x1, y1, z1,                     x2, y2, z2,                     x3, y3, z3);     # This code is contributed by AbhiThakur

## C#

 // C# program for the above approach  using System;  class GFG{         // Function to find the angle   // between the two lines  static void calculateAngle(int x1, int y1,                              int z1, int x2,                              int y2, int z2,                             int x3, int y3,                              int z3)  {             // Find direction ratio of line AB      int ABx = x1 - x2;      int ABy = y1 - y2;      int ABz = z1 - z2;         // Find direction ratio of line BC      int BCx = x3 - x2;      int BCy = y3 - y2;      int BCz = z3 - z2;         // Find the dotProduct      // of lines AB & BC      double dotProduct = ABx * BCx +                          ABy * BCy +                           ABz * BCz;         // Find magnitude of      // line AB and BC      double magnitudeAB = ABx * ABx +                            ABy * ABy +                            ABz * ABz;      double magnitudeBC = BCx * BCx +                            BCy * BCy +                            BCz * BCz;         // Find the cosine of the       // angle formed by line      // AB and BC      double angle = dotProduct;      angle /= Math.Sqrt(magnitudeAB *                          magnitudeBC);         // Find angle in radian      angle = (angle * 180) / 3.14;         // Print the angle      Console.Write(String.Format("{0:F4}", Math.Abs(angle)));  }     // Driver code  public static void Main()  {         // Given coordinates      // Points A      int x1 = 1, y1 = 3, z1 = 3;         // Points B      int x2 = 3, y2 = 4, z2 = 5;         // Points C      int x3 = 5, y3 = 6, z3 = 9;         // Function Call      calculateAngle(x1, y1, z1,                     x2, y2, z2,                     x3, y3, z3);  }  }     // This code is contributed by Code_Mech

Output:

54.6065


Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.