Given the co-ordinates of a 2-dimensional point p(x_{0}, y_{0}). 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 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++ 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

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

## leave a comment

## 0 Comments