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

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.  
If slope is zero, we just need to adjust the x coordinate of the source pointIf slope is infinite, the we need to adjust the y coordinateFor other values of slope, we can use the following equations to find the points
If slope is zero, we just need to adjust the x coordinate of the source point
If slope is infinite, the we need to adjust the y coordinate
For other values of slope, we can use the following equations to find the points
 
Now using the above formula we can find the required points.
 
C++
Java
C#
Python3
Javascript
// 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// pointstruct 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 sourcevoid 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 functionint main(){    Point p(2, 1), q(1, 0);    printPoints(p, sqrt(2), 1);    cout << endl;    printPoints(q, 5, 0);    return 0;}
// Java program to find the points on // a line of slope M at distance Lclass GFG{ // Class to represent a co-ordinate// pointstatic 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 sourcestatic 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 codepublic 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# program to find the points on // a line of slope M at distance Lusing System; class GFG{ // Class to represent a co-ordinate// pointpublic 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 sourcestatic 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 codepublic 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
# Python program to find the points on a line of# slope M at distance Limport 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 functionp = 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)
<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. 
Rajnis09
amit143katiyar
rajeev0719singh
shruti456rawal
ajaymakvana
gautamgoel962
Geometric
Mathematical
Mathematical
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Optimum location of point to minimize total distance
Line Clipping | Set 1 (Cohen–Sutherland Algorithm)
Convex Hull | Set 1 (Jarvis's Algorithm or Wrapping)
Check whether a given point lies inside a triangle or not
Program for Point of Intersection of Two Lines
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays