Skip to content
Related Articles

Related Articles

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

View Discussion
Improve Article
Save Article
  • Last Updated : 14 Jun, 2022
View Discussion
Improve Article
Save Article

Given four integers a, b, c and d, 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)

 


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!