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

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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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

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

// 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 infinte
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;
}

Output:

3, 2
1, 0

6, 0
-4, 0

This article is contributed by Ashutosh Kumar 😀 If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

# GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.
2 Average Difficulty : 2/5.0
Based on 1 vote(s)