Thursday, July 4, 2024
HomeData ModellingData Structure & AlgorithmEquation of a straight line passing through a point and making a...

Equation of a straight line passing through a point and making a given angle with a given line

Given four integers a, b, c representing coefficients of a straight line with equation (ax + by + c = 0), the task is to find the equations of the two straight lines passing through a given point (x1, y1)                 and making an angle ? with the given straight line.

Examples:

Input: a = 2, b = 3, c = -7, x1 = 4, y1 = 9, ? = 30
Output: y = -0.49x +10
              y = -15.51x + 71

Input: a = 3, b = -2, c = 4, x1 = 3, y1 = 4, ? = 55
Output: y = 43.73x -127  
              y = -0.39x +5

Approach:

Figure 1

  • Let P (x1, y1) be the given point and line LMN (In figure 1) be the given line making an angle ? with the positive x-axis.
  • Let PMR and PNS be two required lines which makes an angle (?) with the given line.
  • Let these lines meet the x-axis at R and S respectively.
  • Suppose line PMR and PNS make angles (?1) and (?2) respectively with the positive direction of the x-axis.
  • Then using the slope point form of a straight line, the equation of two lines are :

y - y1 = tan ?1 ( x - x1 )                  … (1)
y - y1 = tan ?2 ( x - x1 )                  … (2)
tan(?1)                 and tan(?2)                  are the slopes of lines PMR and PNS respectively. 

Figure 2

  • Now consider triangle LMR:

Using the property: An exterior angle of a triangle is equal to the sum of the two opposite interior angles
?1 = ? + ?

tan ( ?1 ) = tan ( ? + ? )                   
tan ( ?1 ) = (tan ? + tan ?)/(1 - tan ?*tan ?)                  … (3)

  • Now consider triangle LNS:

Figure 3

?2 = ? + ( 180 - ? )                  
tan ( ?2 ) = tan ( 180 + ? - ? )
tan ( ?2 ) = tan ( ? - ? )
tan ( ?2 ) = (tan ? - tan ?)/(1 + tan ?*tan ? )                  … (4)

  • Now we calculate the value of (tan?):

By formula,  
tan ( ? ) =                  slope of given line = -b/a                  = m

  • Now substitute the values of (tan(?1)) and (tan(?2)) from equations (3) and (4) to equations (1) and (2) to get the final equations of both the lines:

Line PMR : y-y1 = ((m+tan ?)/(1-m*tan ?)) * (x-x1)
Line PNS : y-y1 = ((m-tan ?)/(1+m*tan ?)) * (x-x1)

Below is the implementation of the above approach: 

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find slope of given line
double line_slope(double a, double b)
{
    if (a != 0)
        return -b / a;
 
    // Special case when slope of
    // line is infinity or is
    // perpendicular to x-axis
    else
        return (-2);
}
 
// Function to find equations of lines
// passing through the given point
// and making an angle with given line
void line_equation(double a, double b,
                   double c, double x1,
                   double y1, double alfa)
{
    // Set the precision
    cout << fixed << setprecision(2);
 
    // Store slope of given line
    double given_slope = line_slope(a, b);
 
    // Convert degrees to radians
    double x = alfa * 3.14159 / 180;
 
    // Special case when slope of
    // given line is infinity:
    // In this case slope of one line
    // will be equal to alfa
    // and the other line will be
    // equal to (180-alfa)
    if (given_slope == -2) {
 
        // In this case slope of
        // required lines can't be
        // infinity
        double slope_1 = tan(x);
        double slope_2 = tan(3.14159 - x);
 
        // g and f are the variables
        // of required equations
        int g = x1, f = x1;
        g *= (-slope_1);
        g += y1;
 
        // Print first line equation
        if (g > 0)
            cout << "y = " << slope_1
                 << "x +" << g << endl;
        if (g <= 0)
            cout << "y = " << slope_1
                 << "x " << g << endl;
 
        f *= (-slope_2);
        f += y1;
 
        // Print second line equation
        if (f > 0) {
            cout << "y = " << slope_2
                 << "x +" << f << endl;
        }
        if (f <= 0)
            cout << "y = " << slope_2
                 << "x " << f << endl;
        return;
    }
 
    // Special case when slope of
    // required line becomes infinity
    if (1 - tan(x) * given_slope == 0) {
        cout << "x = " << x1 << endl;
    }
    if (1 + tan(x) * given_slope == 0) {
        cout << "x = " << x1 << endl;
    }
 
    // General case
    double slope_1 = (given_slope + tan(x))
                     / (1 - tan(x) * given_slope);
    double slope_2 = (given_slope - tan(x))
                     / (1 + tan(x) * given_slope);
 
    // g and f are the variables
    // of required equations
    int g = x1, f = x1;
    g *= (-slope_1);
    g += y1;
 
    // Print first line equation
    if (g > 0 && 1 - tan(x) * given_slope != 0)
        cout << "y = " << slope_1
             << "x +" << g << endl;
    if (g <= 0 && 1 - tan(x) * given_slope != 0)
        cout << "y = " << slope_1
             << "x " << g << endl;
    f *= (-slope_2);
    f += y1;
 
    // Print second line equation
    if (f > 0 && 1 + tan(x) * given_slope != 0) {
        cout << "y = " << slope_2
             << "x +" << f << endl;
    }
    if (f <= 0 && 1 + tan(x) * given_slope != 0)
        cout << "y = " << slope_2
             << "x " << f << endl;
}
 
// Driver Code
int main()
{
    // Given Input
    double a = 2, b = 3, c = -7;
    double x1 = 4, y1 = 9;
    double alfa = 30;
 
    // Function Call
    line_equation(a, b, c, x1, y1, alfa);
 
    return 0;
}


Java




// Java program for the above approach
import java.io.*;
 
class GFG{
   
// Function to find slope of given line
static double line_slope(double a, double b)
{
    if (a != 0)
        return -b / a;
 
    // Special case when slope of
    // line is infinity or is
    // perpendicular to x-axis
    else
        return (-2);
}
 
// Function to find equations of lines
// passing through the given point
// and making an angle with given line
static void line_equation(double a, double b,
                          double c, double x1,
                          double y1, double alfa)
{
     
    // Store slope of given line
    double given_slope = line_slope(a, b);
 
    // Convert degrees to radians
    double x = alfa * 3.14159 / 180;
 
    // Special case when slope of
    // given line is infinity:
    // In this case slope of one line
    // will be equal to alfa
    // and the other line will be
    // equal to (180-alfa)
    if (given_slope == -2)
    {
         
        // In this case slope of
        // required lines can't be
        // infinity
        double slope_1 = Math.tan(x);
        double slope_2 = Math.tan(3.14159 - x);
 
        // g and f are the variables
        // of required equations
        int g = (int)x1, f = (int)x1;
        g *= (-slope_1);
        g += y1;
 
        // Print first line equation
        if (g > 0)
            System.out.println("y = " +
            (Math.round(slope_1 * 100.0) / 100.0) +
          "x +" + (Math.round(g * 100.0) / 100.0));
        if (g <= 0)
             System.out.println("y = " +
             (Math.round(slope_1 * 100.0) / 100.0) +
            "x " + (Math.round(g * 100.0) / 100.0));
 
        f *= (-slope_2);
        f += y1;
 
        // Print second line equation
        if (f > 0)
        {
             System.out.println("y = " +
             (Math.round(slope_2 * 100.0) / 100.0) +
           "x +" + (Math.round(f * 100.0) / 100.0));
        }
        if (f <= 0)
             System.out.println("y = " +
             (Math.round(slope_1 * 100.0) / 100.0) +
            "x " + (Math.round(g * 100.0) / 100.0));
        return;
    }
 
    // Special case when slope of
    // required line becomes infinity
    if (1 - Math.tan(x) * given_slope == 0)
    {
         System.out.println("x = " +
         (Math.round(x1 * 100.0) / 100.0));
    }
    if (1 + Math.tan(x) * given_slope == 0)
    {
        System.out.println("x = " +
        (Math.round(x1 * 100.0) / 100.0));
    }
 
    // General case
    double slope_1 = (given_slope + Math.tan(x)) /
                 (1 - Math.tan(x) * given_slope);
    double slope_2 = (given_slope - Math.tan(x)) /
                 (1 + Math.tan(x) * given_slope);
 
    // g and f are the variables
    // of required equations
    int g = (int)x1, f = (int)x1;
    g *= (-slope_1);
    g += y1;
 
    // Print first line equation
    if (g > 0 && 1 - Math.tan(x) * given_slope != 0)
          System.out.println("y = " +
          (Math.round(slope_1 * 100.0) / 100.0) +
      "x +" + (Math.round(g * 100.0) / 100.0));
    if (g <= 0 && 1 - Math.tan(x) * given_slope != 0)
       System.out.println("y = " +
       (Math.round(slope_1 * 100.0) / 100.0) +
      "x " + (Math.round(g * 100.0) / 100.0));
       
    f *= (-slope_2);
    f += y1;
 
    // Print second line equation
    if (f > 0 && 1 + Math.tan(x) * given_slope != 0)
    {
        System.out.println("y = " +
        (Math.round(slope_2 * 100.0) / 100.0) +
      "x +" + (Math.round(f * 100.0) / 100.0));
    }
    if (f <= 0 && 1 + Math.tan(x) * given_slope != 0)
        System.out.println("y = " +
        (Math.round(slope_2 * 100.0) / 100.0) +
      "x +" + (Math.round(f * 100.0) / 100.0));
}
 
// Driver Code
public static void main (String[] args)
{
     
    // Given Input
    double a = 2, b = 3, c = -7;
    double x1 = 4, y1 = 9;
    double alfa = 30;
     
    // Function Call
    line_equation(a, b, c, x1, y1, alfa);
}
}
 
// This code is contributed by Dharanendra L V.


Python3




# Python3 program for the above approach
import math
 
# Function to find slope of given line
def line_slope(a, b):
 
    if (a != 0):
        return -b / a
 
    # Special case when slope of
    # line is infinity or is
    # perpendicular to x-axis
    else:
        return (-2)
 
# Function to find equations of lines
# passing through the given point
# and making an angle with given line
def line_equation(a, b, c, x1, y1, alfa):
     
    # Store slope of given line
    given_slope = line_slope(a, b)
 
    # Convert degrees to radians
    x = alfa * 3.14159 / 180
 
    # Special case when slope of
    # given line is infinity:
    # In this case slope of one line
    # will be equal to alfa
    # and the other line will be
    # equal to (180-alfa)
    if (given_slope == -2):
 
        # In this case slope of
        # required lines can't be
        # infinity
        slope_1 = math.tan(x)
        slope_2 = math.tan(3.14159 - x)
 
        # g and f are the variables
        # of required equations
        g = x1, f = x1
        g *= (-slope_1)
        g += y1
 
        # Print first line equation
        if (g > 0):
            print("y = ", round(slope_1, 2),
                  "x +" , round(g));
        if (g <= 0):
            print("y = ", round(slope_1, 2),
                  "x ", round(g))
 
        f *= (-slope_2)
        f += y1
 
        # Print second line equation
        if (f > 0):
            print("y = ", round(slope_2, 2),
                  "x +", round(f))
         
        if (f <= 0):
            print("y = " , round(slope_2, 2),
                  "x " , round(f))
        return
     
    # Special case when slope of
    # required line becomes infinity
    if (1 - math.tan(x) * given_slope == 0):
        print("x =", x1)
     
    if (1 + math.tan(x) * given_slope == 0):
        print("x =", x1)
     
    # General case
    slope_1 = ((given_slope + math.tan(x)) /
           (1 - math.tan(x) * given_slope))
    slope_2 = ((given_slope - math.tan(x)) /
           (1 + math.tan(x) * given_slope))
 
    # g and f are the variables
    # of required equations
    g = x1
    f = x1
    g *= (-slope_1)
    g += y1
 
    # Print first line equation
    if (g > 0 and 1 - math.tan(x) * given_slope != 0):
        print("y = ", round(slope_1, 2),
              "x +", round(g))
    if (g <= 0 and 1 - math.tan(x) * given_slope != 0):
        print("y = ", round(slope_1, 2),
              "x ", round(g))
               
    f *= (-slope_2)
    f += y1
 
    # Print second line equation
    if (f > 0 and 1 + math.tan(x) * given_slope != 0):
        print("y = ", round(slope_2, 2),
              "x +", round(f))
     
    if (f <= 0 and 1 + math.tan(x) * given_slope != 0):
        print("y = ", round(slope_2, 2),
              "x " , round(f))
               
# Driver Code
if __name__ == "__main__":
 
    # Given Input
    a = 2
    b = 3
    c = -7
    x1 = 4
    y1 = 9
    alfa = 30
     
    # Function Call
    line_equation(a, b, c, x1, y1, alfa)
 
# This code is contributed by ukasp


C#




// C# program for the above approach
 
 
using System;
using System.Collections.Generic;
public class GFG{
   
// Function to find slope of given line
static double line_slope(double a, double b)
{
    if (a != 0)
        return -b / a;
 
    // Special case when slope of
    // line is infinity or is
    // perpendicular to x-axis
    else
        return (-2);
}
 
// Function to find equations of lines
// passing through the given point
// and making an angle with given line
static void line_equation(double a, double b,
                          double c, double x1,
                          double y1, double alfa)
{
     
    // Store slope of given line
    double given_slope = line_slope(a, b);
 
    // Convert degrees to radians
    double x = alfa * 3.14159 / 180;
    double slope_1,slope_2;
    double g,f;
    // Special case when slope of
    // given line is infinity:
    // In this case slope of one line
    // will be equal to alfa
    // and the other line will be
    // equal to (180-alfa)
    if (given_slope == -2)
    {
         
        // In this case slope of
        // required lines can't be
        // infinity
        slope_1 = Math.Tan(x);
        slope_2 = Math.Tan(3.14159 - x);
 
        // g and f are the variables
        // of required equations
        g = (int)x1;
        f = (int)x1;
        g *= (-slope_1);
        g += y1;
 
        // Print first line equation
        if (g > 0)
            Console.WriteLine("y = " +
            (Math.Round(slope_1 * 100.0) / 100.0) +
          "x +" + (Math.Round((int)g * 100.0) / 100.0));
        if (g <= 0)
             Console.WriteLine("y = " +
             (Math.Round(slope_1 * 100.0) / 100.0) +
            "x " + (Math.Round((int)g * 100.0) / 100.0));
 
        f *= (-slope_2);
        f += y1;
 
        // Print second line equation
        if (f > 0)
        {
             Console.WriteLine("y = " +
             (Math.Round(slope_2 * 100.0) / 100.0) +
           "x +" + (Math.Round((int)f * 100.0) / 100.0));
        }
        if (f <= 0)
             Console.WriteLine("y = " +
             (Math.Round(slope_1 * 100.0) / 100.0) +
            "x " + (Math.Round((int)g * 100.0) / 100.0));
        return;
    }
 
    // Special case when slope of
    // required line becomes infinity
    if (1 - Math.Tan(x) * given_slope == 0)
    {
         Console.WriteLine("x = " +
         (Math.Round(x1 * 100.0) / 100.0));
    }
    if (1 + Math.Tan(x) * given_slope == 0)
    {
        Console.WriteLine("x = " +
        (Math.Round(x1 * 100.0) / 100.0));
    }
 
    // General case
    slope_1 = (given_slope + Math.Tan(x)) /
                 (1 - Math.Tan(x) * given_slope);
    slope_2 = (given_slope - Math.Tan(x)) /
                 (1 + Math.Tan(x) * given_slope);
 
    // g and f are the variables
    // of required equations
    g = (int)x1;
    f = (int)x1;
    g *= (-slope_1);
    g += y1;
 
    // Print first line equation
    if (g > 0 && 1 - Math.Tan(x) * given_slope != 0)
          Console.WriteLine("y = " +
          (Math.Round(slope_1 * 100.0) / 100.0) +
      "x +" + (Math.Round((int)g * 100.0) / 100.0));
    if (g <= 0 && 1 - Math.Tan(x) * given_slope != 0)
       Console.WriteLine("y = " +
       (Math.Round(slope_1 * 100.0) / 100.0) +
      "x " + (Math.Round((int)g * 100.0) / 100.0));
       
    f *= (-slope_2);
    f += y1;
 
    // Print second line equation
    if (f > 0 && 1 + Math.Tan(x) * given_slope != 0)
    {
        Console.WriteLine("y = " +
        (Math.Round(slope_2 * 100.0) / 100.0) +
      "x +" + (Math.Round((int)f * 100.0) / 100.0));
    }
    if (f <= 0 && 1 + Math.Tan(x) * given_slope != 0)
        Console.WriteLine("y = " +
        (Math.Round(slope_2 * 100.0) / 100.0) +
      "x +" + (Math.Round((int)f * 100.0) / 100.0));
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Given Input
    double a = 2, b = 3, c = -7;
    double x1 = 4, y1 = 9;
    double alfa = 30;
     
    // Function Call
    line_equation(a, b, c, x1, y1, alfa);
}
}
 
// This code contributed by shikhasingrajput


Javascript




// JavaScript program for the above approach
 
// Function to find slope of given line
function line_slope(a, b)
{
    if (a != 0)
        return -b / a;
 
    // Special case when slope of
    // line is infinity or is
    // perpendicular to x-axis
    else
        return (-2);
}
 
// Function to find equations of lines
// passing through the given point
// and making an angle with given line
function line_equation(a, b, c, x1, y1, alfa)
{
     
    // Store slope of given line
    let given_slope = line_slope(a, b);
 
    // Convert degrees to radians
    let x = alfa * 3.14159 / 180;
 
    // Special case when slope of
    // given line is infinity:
    // In this case slope of one line
    // will be equal to alfa
    // and the other line will be
    // equal to (180-alfa)
    if (given_slope == -2) {
 
        // In this case slope of
        // required lines can't be
        // infinity
        let slope_1 = Math.tan(x);
        let slope_2 = Math.tan(3.14159 - x);
 
        // g and f are the variables
        // of required equations
        let g = x1, f = x1;
        g = g*(-slope_1);
        g = g + y1;
 
        // Print first line equation
        if (g > 0)
            console.log("y = ", slope_1.toFixed(2), "x +", Math.floor(g));
        if (g <= 0)
            console.log("y = ", slope_1.toFixed(2), "x ", Math.floor(g));
 
        f = f*(-slope_2);
        f = f+y1;
 
        // Print second line equation
        if (f > 0) {
            console.log("y = ", slope_2.toFixed(2), "x +", Math.floor(f));
        }
        if (f <= 0){
            console.log("y = ", slope_2.toFixed(2), "x ", Math.floor(f));
        }
        return;
    }
 
    // Special case when slope of
    // required line becomes infinity
    if (1 - Math.tan(x) * given_slope == 0) {
        console.log("x = ", x1.toFixed(2));
    }
    if (1 + Math.tan(x) * given_slope == 0) {
        console.log("x = ", x1.toFixed(2));
    }
 
    // General case
    let slope_1 = (given_slope + Math.tan(x))
                     / (1 - Math.tan(x) * given_slope);
    let slope_2 = (given_slope - Math.tan(x))
                     / (1 + Math.tan(x) * given_slope);
 
    // g and f are the variables
    // of required equations
    let g = x1, f = x1;
    g *= (-slope_1);
    g += y1;
 
    // Print first line equation
    if (g > 0 && 1 - Math.tan(x) * given_slope != 0)
        console.log("y = ", slope_1.toFixed(2), "x +", Math.floor(g));
    if (g <= 0 && 1 - tan(x) * given_slope != 0)
        console.log("y = ", slope_1.toFixed(2), "x ", Math.floor(g));
     
    f *= (-slope_2);
    f += y1;
 
    // Print second line equation
    if (f > 0 && 1 + Math.tan(x) * given_slope != 0) {
        console.log("y = ", slope_2.toFixed(2), "x +", Math.floor(f));
    }
    if (f <= 0 && 1 + tan(x) * given_slope != 0)
        console.log("y = ", slope_2.toFixed(2), "x ", Math.floor(f));
}
 
// Driver Code
 
// Given Input
let a = 2, b = 3, c = -7;
let x1 = 4, y1 = 9;
let alfa = 30;
 
// Function Call
line_equation(a, b, c, x1, y1, alfa);
 
// The code is contributed by Gautam goel (gautamgoel962)


Output: 

y = -0.49x +10
y = -15.51x +71

 

Time Complexity: O(1)
Auxiliary Space: O(1)

 

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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments