Saturday, September 21, 2024
Google search engine
HomeData Modelling & AIAngle between a Pair of Lines in 3D

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 the 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  

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 

3. 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| = \sqrt{a^{2} + b^{2} + c^{2}}
magnitude of B = |B| = \sqrt{x^{2} + y^{2} + z^{2}}     

4. 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


Javascript




<script>
 
 
// Javascript program for the above approach
 
var PI = 3.14;
 
// Function to find the angle between
// the two lines
function calculateAngle(
    x1, y1, z1,
    x2, y2, z2,
    x3, y3, z3)
{
    // Find direction ratio of line AB
    var ABx = x1 - x2;
    var ABy = y1 - y2;
    var ABz = z1 - z2;
 
    // Find direction ratio of line BC
    var BCx = x3 - x2;
    var BCy = y3 - y2;
    var BCz = z3 - z2;
 
    // Find the dotProduct
    // of lines AB & BC
    var dotProduct
        = ABx * BCx
          + ABy * BCy
          + ABz * BCz;
 
    // Find magnitude of
    // line AB and BC
    var magnitudeAB
        = ABx * ABx
          + ABy * ABy
          + ABz * ABz;
    var magnitudeBC
        = BCx * BCx
          + BCy * BCy
          + BCz * BCz;
 
    // Find the cosine of
    // the angle formed
    // by line AB and BC
    var angle = dotProduct;
    angle /= Math.sqrt(
        magnitudeAB * magnitudeBC);
 
    // Find angle in radian
    angle = (angle * 180) / PI;
 
    // Print the angle
    document.write(Math.abs(angle).toFixed(4));
}
 
// Driver Code
// Given coordinates
// Points A
var x1 = 1, y1 = 3, z1 = 3;
// Points B
var x2 = 3, y2 = 4, z2 = 5;
// Points C
var x3 = 5, y3 = 6, z3 = 9;
// Function Call
calculateAngle(x1, y1, z1,
               x2, y2, z2,
               x3, y3, z3);
 
 
</script>


Output: 

54.6065

 

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

RELATED ARTICLES

Most Popular

Recent Comments