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
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++
// 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 |
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 math.isfinite(m) is False : 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) |
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 |
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 ?
Contact Us