Skip to content
Related Articles

Related Articles

Find points at a given distance on a line of given slope

View Discussion
Improve Article
Save Article
Like Article
  • Difficulty Level : Easy
  • Last Updated : 17 Jun, 2022

Given the co-ordinates of a 2-dimensional point p(x0, y0). Find the points at a distance L away from it, such that the line formed by joining these points has a slope of M.

Examples: 

Input : p = (2, 1)
        L = sqrt(2)
        M = 1
Output :3, 2
        1, 0
Explanation:
The two points are sqrt(2) distance away 
from the source and have the required slope
m = 1.

Input : p = (1, 0)
        L = 5
        M = 0
Output : 6, 0
        -4, 0

We need to find two points that are L distance from given point, on a line with slope M.
The idea has been introduced in below post. 
Find Corners of Rectangle using mid points

Based on the input slope, the problem can be classified into 3 categories.  

  1. If slope is zero, we just need to adjust the x coordinate of the source point
  2. If slope is infinite, the we need to adjust the y coordinate
  3. For other values of slope, we can use the following equations to find the points

  Given \ that \ the \ point (x, y) \ is \ at \ distance \ I \ away \ from \ (x_0, y_0) \newline \newline (y-y_0)^{2} + (x-x_0)^{2}= l^{2} \newline \newline Also \ as \ the \ line  \ that \ passes \ through \ (x, y) \ and \ (x0, y0) \ satisfies \newline \newline \frac{y-y_0}{x-x_0}= m \newline \newline Rearranging \ we \ get \newline y=y_0+m*(x-x_0) \newline \newline  Putting \ the \ values \ in \ first \ equation \newline \newline  m^2.(x-x_0)^2+(x-x_0)^2=l^2 \newline \newline Hence, \ we \ have \newline \newline x=x_0\pm l.\sqrt{\frac{1}{1+m^2}} \newline \newline y=y_0 \pm m.l.\sqrt{\frac{1}{1+m^2}}
 

Now using the above formula we can find the required points.

 

C++




// C++ program to find the points on a line of
// slope M at distance L
#include <bits/stdc++.h>
using namespace std;
 
// structure to represent a co-ordinate
// point
struct Point {
 
    float x, y;
    Point()
    {
        x = y = 0;
    }
    Point(float a, float b)
    {
        x = a, y = b;
    }
};
 
// Function to print pair of points at
// distance 'l' and having a slope 'm'
// from the source
void printPoints(Point source, float l,
                                 int m)
{
    // m is the slope of line, and the
    // required Point lies distance l
    // away from the source Point
    Point a, b;
 
    // slope is 0
    if (m == 0) {
        a.x = source.x + l;
        a.y = source.y;
 
        b.x = source.x - l;
        b.y = source.y;
    }
 
    // if slope is infinite
    else if (m == std::numeric_limits<float>
                                 ::max()) {
        a.x = source.x;
        a.y = source.y + l;
 
        b.x = source.x;
        b.y = source.y - l;
    }
    else {
        float dx = (l / sqrt(1 + (m * m)));
        float dy = m * dx;
        a.x = source.x + dx;
        a.y = source.y + dy;
        b.x = source.x - dx;
        b.y = source.y - dy;
    }
 
    // print the first Point
    cout << a.x << ", " << a.y << endl;
 
    // print the second Point
    cout << b.x << ", " << b.y << endl;
}
 
// driver function
int main()
{
    Point p(2, 1), q(1, 0);
    printPoints(p, sqrt(2), 1);
    cout << endl;
    printPoints(q, 5, 0);
    return 0;
}

Java




// Java program to find the points on 
// a line of slope M at distance L
class GFG{
 
// Class to represent a co-ordinate
// point
static class Point
{
    float x, y;
    Point()
    {
        x = y = 0;
    }
    Point(float a, float b)
    {
        x = a;
        y = b;
    }
};
 
// Function to print pair of points at
// distance 'l' and having a slope 'm'
// from the source
static void printPoints(Point source,
                        float l, int m)
{
     
    // m is the slope of line, and the
    // required Point lies distance l
    // away from the source Point
    Point a = new Point();
    Point b = new Point();
     
    // Slope is 0
    if (m == 0)
    {
        a.x = source.x + l;
        a.y = source.y;
 
        b.x = source.x - l;
        b.y = source.y;
    }
 
    // If slope is infinite
    else if (Double.isInfinite(m))
    {
        a.x = source.x;
        a.y = source.y + l;
 
        b.x = source.x;
        b.y = source.y - l;
    }
    else
    {
        float dx = (float)(l / Math.sqrt(1 + (m * m)));
        float dy = m * dx;
        a.x = source.x + dx;
        a.y = source.y + dy;
        b.x = source.x - dx;
        b.y = source.y - dy;
    }
 
    // Print the first Point
    System.out.println(a.x + ", " + a.y);
 
    // Print the second Point
    System.out.println(b.x + ", " + b.y);
}
 
// Driver code
public static void main(String[] args)
{
    Point p = new Point(2, 1),
          q = new Point(1, 0);
    printPoints(p, (float)Math.sqrt(2), 1);
     
    System.out.println();
     
    printPoints(q, 5, 0);
}
}
 
// This code is contributed by Rajnis09

C#




// C# program to find the points on 
// a line of slope M at distance L
using System;
 
class GFG{
 
// Class to represent a co-ordinate
// point
public class Point
{
    public float x, y;
     
    public Point()
    {
        x = y = 0;
    }
     
    public Point(float a, float b)
    {
        x = a;
        y = b;
    }
};
 
// Function to print pair of points at
// distance 'l' and having a slope 'm'
// from the source
static void printPoints(Point source,
                        float l, int m)
{
     
    // m is the slope of line, and the
    // required Point lies distance l
    // away from the source Point
    Point a = new Point();
    Point b = new Point();
     
    // Slope is 0
    if (m == 0)
    {
        a.x = source.x + l;
        a.y = source.y;
 
        b.x = source.x - l;
        b.y = source.y;
    }
 
    // If slope is infinite
    else if (Double.IsInfinity(m))
    {
        a.x = source.x;
        a.y = source.y + l;
 
        b.x = source.x;
        b.y = source.y - l;
    }
    else
    {
        float dx = (float)(l / Math.Sqrt(
                           1 + (m * m)));
        float dy = m * dx;
        a.x = source.x + dx;
        a.y = source.y + dy;
        b.x = source.x - dx;
        b.y = source.y - dy;
    }
 
    // Print the first Point
    Console.WriteLine(a.x + ", " + a.y);
 
    // Print the second Point
    Console.WriteLine(b.x + ", " + b.y);
}
 
// Driver code
public static void Main(String[] args)
{
    Point p = new Point(2, 1),
          q = new Point(1, 0);
           
    printPoints(p, (float)Math.Sqrt(2), 1);
     
    Console.WriteLine();
     
    printPoints(q, 5, 0);
}
}
 
// This code is contributed by Amit Katiyar

Python3




# Python program to find the points on a line of
# slope M at distance L
import math
 
 
# structure to represent a co-ordinate
# point
 
 
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
 
# Function to print pair of points at
# distance 'l' and having a slope 'm'
# from the source
 
 
def printPoints(source, l, m):
    # m is the slope of line, and the
    # required Point lies distance l
    # away from the source Point
    a = Point(0, 0)
    b = Point(0, 0)
 
    # slope is 0
    if m == 0:
        a.x = source.x + l
        a.y = source.y
 
        b.x = source.x - l
        b.y = source.y
 
    # if slope is infinite
    elif m != math.isfinite(m):
        a.x = source.x
        a.y = source.y + l
 
        b.x = source.x
        b.y = source.y - l
    else:
        dx = (l / math.sqrt(1 + (m * m)))
        dy = m * dx
        a.x = source.x + dx
        a.y = source.y + dy
        b.x = source.x - dx
        b.y = source.y - dy
 
    # print the first Point
    print(f"{a.x}, {a.y}")
 
    # print the second Point
    print(f"{b.x}, {b.y}")
 
 
# driver function
p = Point(2, 1)
q = Point(1, 0)
printPoints(p, math.sqrt(2), 1)
print("\n")
printPoints(q, 5, 0)
 
# The code is contributed by Gautam goel(gautamgoel962)

Javascript




<script>
    // Javascript program to find the points on
    // a line of slope M at distance L
       
    // Class to represent a co-ordinate
    // point
    class Point
    {
        constructor(x, y)
        {
            this.x = x;
            this.y = y;
        }
    }
     
    // Function to print pair of points at
    // distance 'l' and having a slope 'm'
    // from the source
    function printPoints(source, l, m)
    {
     
        // m is the slope of line, and the
        // required Point lies distance l
        // away from the source Point
        let a = new Point();
        let b = new Point();
          
        // Slope is 0
        if (m == 0)
        {
            a.x = source.x + l;
            a.y = source.y;
      
            b.x = source.x - l;
            b.y = source.y;
        }
      
        // If slope is infinite
        else if (!isFinite(m))
        {
            a.x = source.x;
            a.y = source.y + l;
      
            b.x = source.x;
            b.y = source.y - l;
        }
        else
        {
            var dx = (l / Math.sqrt(1 + (m * m)));
            var dy = m * dx;
            a.x = source.x + dx;
            a.y = source.y + dy;
            b.x = source.x - dx;
            b.y = source.y - dy;
        }
      
        // Print the first Point
        document.write(a.x + ", " + a.y+"\n");
      
        // Print the second Point
        document.write(b.x + ", " + b.y+"\n");
    }
     
    // Driver code
    let p = new Point(2, 1);
    let q = new Point(1, 0);
    printPoints(p, Math.sqrt(2), 1);
    document.write("\n");
    printPoints(q, 5, 0);
     
    // This code is contributed by shruti456rawal
</script>

Output: 

3, 2
1, 0

6, 0
-4, 0

Time Complexity: O(1)

Auxiliary Space: O(1)

This article is contributed by Ashutosh Kumar 😀 If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
 


My Personal Notes arrow_drop_up
Recommended Articles
Page :

Start Your Coding Journey Now!