Find the equation of the straight line passing through the given points
Last Updated :
26 Nov, 2021
Given an array arr containing N coordinate points in a plane, the task is to check whether the coordinate points lie on a straight line or not. If they lie on a straight line then print Yes and also the equation of that line otherwise print No.
Example:
Input: arr[] = {{1, 1}, {2, 2}, {3, 3}}
Output:
Yes
1x- 1y=0
Input: arr[] = {{0, 1}, {2, 0}}
Output:
Yes
2y+x-2 = 0
Input: arr[] = {{1, 5}, {2, 2}, {4, 6}, {3, 5}}
Output: No
Approach: The idea is to find the equation of the line that can be formed using any one pair of points given in the array and if all other points satisfy the equation of the line formed using the pair of the points, then all these points together form a straight line. So, if all points satisfy the equation of the line, then print Yes followed by the equation of the line, otherwise print No.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void isStraightLinePossibleEq(
vector<pair< int , int > > arr,
int n)
{
int x0 = arr[0].first;
int y0 = arr[0].second;
int x1 = arr[1].first;
int y1 = arr[1].second;
int dx = x1 - x0,
dy = y1 - y0,
c = dy * x0 - dx * y0;
for ( int i = 2; i < n; i++) {
int x = arr[i].first, y = arr[i].second;
if ((dx * y) - (dy * x) != c) {
cout << "No" ;
return ;
}
}
cout << "Yes" << endl;
cout << dy << "x-" << dx
<< "y=" << c << "\n" ;
}
int main()
{
vector<pair< int , int > > arr
= { { 0, 0 }, { 1, 1 }, { 3, 3 }, { 2, 2 } };
int N = 2;
isStraightLinePossibleEq(arr, N);
return 0;
}
|
Java
import java.util.*;
public class GFG
{
static void isStraightLinePossibleEq( int arr[][], int n)
{
int x0 = arr[ 0 ][ 0 ];
int y0 = arr[ 0 ][ 1 ];
int x1 = arr[ 1 ][ 0 ];
int y1 = arr[ 1 ][ 1 ];
int dx = x1 - x0,
dy = y1 - y0,
c = dy * x0 - dx * y0;
for ( int i = 2 ; i < n; i++) {
int x = arr[i][ 0 ], y = arr[i][ 1 ];
if ((dx * y) - (dy * x) != c) {
System.out.print( "No" );
return ;
}
}
System.out.print( "Yes" + "\n" );
System.out.print(dy + "x-" + dx
+ "y=" + c + "\n" );
}
public static void main(String args[])
{
int arr[][] = {{ 0 , 0 }, { 1 , 1 }, { 3 , 3 }, { 2 , 2 }};
int N = 2 ;
isStraightLinePossibleEq(arr, N);
}
}
|
Python3
def isStraightLinePossibleEq(arr, n):
x0 = arr[ 0 ][ 0 ]
y0 = arr[ 0 ][ 1 ]
x1 = arr[ 1 ][ 0 ]
y1 = arr[ 1 ][ 1 ]
dx = x1 - x0
dy = y1 - y0
c = dy * x0 - dx * y0
for i in range ( 2 , n):
x = arr[i][ 0 ], y = arr[i][ 1 ]
if (dx * y) - (dy * x) ! = c:
print ( "No" )
return
print ( "Yes" )
print ( str (dy) + "x" + "-" + str (dx) + "y" + "=" + str (c))
arr = [[ 0 , 0 ], [ 1 , 1 ], [ 3 , 3 ], [ 2 , 2 ]]
N = 2
isStraightLinePossibleEq(arr, N)
|
C#
using System;
using System.Collections;
using System.Collections.Generic;
class GFG
{
static void isStraightLinePossibleEq( int [,]arr, int n)
{
int x0 = arr[0, 0];
int y0 = arr[0, 1];
int x1 = arr[1, 0];
int y1 = arr[1, 1];
int dx = x1 - x0,
dy = y1 - y0,
c = dy * x0 - dx * y0;
for ( int i = 2; i < n; i++) {
int x = arr[i, 0], y = arr[i, 1];
if ((dx * y) - (dy * x) != c) {
Console.Write( "No" );
return ;
}
}
Console.Write( "Yes" + "\n" );
Console.Write(dy + "x-" + dx
+ "y=" + c + "\n" );
}
public static void Main()
{
int [,] arr = new int [4, 2] {{ 0, 0 }, { 1, 1 }, { 3, 3 }, { 2, 2 }};
int N = 2;
isStraightLinePossibleEq(arr, N);
}
}
|
Javascript
<script>
const isStraightLinePossibleEq = (arr, n) => {
let x0 = arr[0][0];
let y0 = arr[0][1];
let x1 = arr[1][0];
let y1 = arr[1][1];
let dx = x1 - x0,
dy = y1 - y0,
c = dy * x0 - dx * y0;
for (let i = 2; i < n; i++) {
let x = arr[i][0], y = arr[i][1];
if ((dx * y) - (dy * x) != c) {
cout << "No" ;
return ;
}
}
document.write( "Yes<br/>" );
document.write(`${dy}x-${dx}y=${c}<br/>`);
}
let arr = [[0, 0], [1, 1], [3, 3], [2, 2]];
let N = 2;
isStraightLinePossibleEq(arr, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...