Check if the tower of sight issue occurs or not - GeeksforGeeks

22 Nov, 2021
Given four co-ordinates A, B, C and D where towers need to be constructed, the task is to check if the tower of sight issue occurs or not.  
Tower of sight issue occurs if the towers at A or C lies in the line joining B and D or vice versa.
Examples:  
Input: A = (0, 0), B = (0, -2), C = (2, 0), D = (0, 2) Output: Yes Explanation: Tower A lies in the line joining B and D.Input: A = (0, 0), B = (0, -2), C = (2, 0), D = (0, -5) Output: No Explanation: No intersection occurs.  
 
Approach:  
If A and C are parallel to the X-axis, check if B or D has y coordinate equal to that of A and C and x coordinate in between that of A and C.
If A and C are parallel to the Y-axis, check if B or D has x coordinate equal to that of A and C and y coordinate in between that of A and C.
Otherwise, check if B or D satisfies the line equation of A and C.
Similarly follow the above three steps to check if A or C lies in between B or D.
Below code is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ program to check if tower// of sight issue occurs or not #include <bits/stdc++.h>using namespace std; // Function to check if point p lies in// between the line joining p1 and p2int checkIntersection(pair<int, int> p1,                      pair<int, int> p2,                      pair<int, int> p){    int val;     // If parallel to X-axis    if (p1.second == p2.second        && p1.second == p.second) {         if (p.first <= max(p1.first, p2.first)            && (p.first >= min(p1.first, p2.first)))             // Point p lies between p1 and p2            return 1;    }     // If parallel to Y-axis    if (p1.first == p2.first        && p1.first == p.first) {         if (p.second <= max(p1.second, p2.second)            && (p.second >= min(p1.second, p2.second)))             // Point p lies between p1 and p2            return 1;    }     // If point p satisfies the equation    // of line joining p1 and p2    else {        val = (p.second - p1.second)                  * (p2.first - p1.first)              - (p.first - p1.first)                    * (p2.second - p1.second);         if (val == 0)            if ((p.first <= max(p1.first, p2.first)                 && (p.first >= min(p1.first, p2.first)))                && (p.second <= max(p1.second, p2.second)                    && (p.second >= min(p1.second, p2.second))))                return 1;    }     return 0;} // Function to check if tower// of sight issue occurredvoid towerOfSight(pair<int, int> a,                  pair<int, int> b,                  pair<int, int> c,                  pair<int, int> d){    int flag = 0;     if (checkIntersection(a, c, b))         // B lies between AC        flag = 1;     else if (checkIntersection(a, c, d))         // D lies between AC        flag = 1;     else if (checkIntersection(b, d, a))         // A lies between BD        flag = 1;     else if (checkIntersection(b, d, c))         // C lies between BD        flag = 1;     flag ? cout << "Yes\n"         : cout << "No\n";} // Driver codeint main(){    // Point A    pair<int, int> a = { 0, 0 };     // Point B    pair<int, int> b = { 0, -2 };     // Point C    pair<int, int> c = { 2, 0 };     // Point D    pair<int, int> d = { 0, 2 };     towerOfSight(a, b, c, d);     return 0;}
// Java program to check if tower// of sight issue occurs or notclass GFG{ static class pair{    int first, second;    public pair(int first, int second)     {        this.first = first;        this.second = second;    }   }   // Function to check if point p lies in// between the line joining p1 and p2static int checkIntersection(pair p1,                      pair p2,                      pair p){    int val;      // If parallel to X-axis    if (p1.second == p2.second        && p1.second == p.second) {          if (p.first <= Math.max(p1.first, p2.first)            && (p.first >= Math.min(p1.first, p2.first)))              // Point p lies between p1 and p2            return 1;    }      // If parallel to Y-axis    if (p1.first == p2.first        && p1.first == p.first) {          if (p.second <= Math.max(p1.second, p2.second)            && (p.second >= Math.min(p1.second, p2.second)))              // Point p lies between p1 and p2            return 1;    }      // If point p satisfies the equation    // of line joining p1 and p2    else {        val = (p.second - p1.second)                  * (p2.first - p1.first)              - (p.first - p1.first)                    * (p2.second - p1.second);          if (val == 0)            if ((p.first <= Math.max(p1.first, p2.first)                 && (p.first >= Math.min(p1.first, p2.first)))                && (p.second <= Math.max(p1.second, p2.second)                    && (p.second >= Math.min(p1.second, p2.second))))                return 1;    }      return 0;}  // Function to check if tower// of sight issue occurredstatic void towerOfSight(pair a,                  pair b,                  pair c,                  pair d){    int flag = 0;      if (checkIntersection(a, c, b) == 1)          // B lies between AC        flag = 1;      else if (checkIntersection(a, c, d) == 1)          // D lies between AC        flag = 1;      else if (checkIntersection(b, d, a) == 1)          // A lies between BD        flag = 1;      else if (checkIntersection(b, d, c) == 1)          // C lies between BD        flag = 1;      System.out.print(flag==1?"Yes\n":"No\n");}  // Driver codepublic static void main(String[] args){    // Point A    pair a = new pair( 0, 0 );      // Point B    pair b = new pair( 0, -2 );      // Point C    pair c = new pair( 2, 0 );      // Point D    pair d = new pair( 0, 2 );      towerOfSight(a, b, c, d);  }} // This code is contributed by Rajput-Ji
# Python 3 program to check if tower# of sight issue occurs or not  # Function to check if point p lies in# between the line joining p1 and p2def checkIntersection(p1,p2,p):      # If parallel to X-axis    if (p1[1] == p2[1]        and p1[1] == p[1]):          if (p[0] <= max(p1[0], p2[0])            and (p[0] >= min(p1[0], p2[0]))):              # Point p lies between p1 and p2            return 1      # If parallel to Y-axis    if (p1[0] == p2[0]        and p1[0] == p[0]):          if (p[1] <= max(p1[1], p2[1])            and (p[1] >= min(p1[1], p2[1]))):              # Point p lies between p1 and p2            return 1      # If point p satisfies the equation    # of line joining p1 and p2    else :        val = ((p[1] - p1[1])*(p2[0] - p1[0])              - (p[0] - p1[0])                    * (p2[1] - p1[1]))          if (val == 0):            if ((p[0] <= max(p1[0], p2[0])                 and (p[0] >= min(p1[0], p2[0])))                and (p[1] <= max(p1[1], p2[1])                    and (p[1] >= min(p1[1], p2[1])))):                return 1      return 0  # Function to check if tower# of sight issue occurreddef towerOfSight(a, b, c, d):    flag = 0      if (checkIntersection(a, c, b)):          # B lies between AC        flag = 1      elif (checkIntersection(a, c, d)):        # D lies between AC        flag = 1      elif (checkIntersection(b, d, a)):          # A lies between BD        flag = 1      elif (checkIntersection(b, d, c)):          # C lies between BD        flag = 1      if(flag):        print("Yes")    else:        print("No")  # Driver codeif __name__ == "__main__":     # Point A    a = [ 0, 0 ]      # Point B    b = [ 0, -2 ]      # Point C    c = [ 2, 0 ]      # Point D    d = [ 0, 2 ]      towerOfSight(a, b, c, d)  # This code is contributed by chitranayal
// C# program to check if tower// of sight issue occurs or notusing System; class GFG{  class pair{    public int first, second;    public pair(int first, int second)     {        this.first = first;        this.second = second;    }   }    // Function to check if point p lies in// between the line joining p1 and p2static int checkIntersection(pair p1,                      pair p2,                      pair p){    int val;       // If parallel to X-axis    if (p1.second == p2.second        && p1.second == p.second) {           if (p.first <= Math.Max(p1.first, p2.first)            && (p.first >= Math.Min(p1.first, p2.first)))               // Point p lies between p1 and p2            return 1;    }       // If parallel to Y-axis    if (p1.first == p2.first        && p1.first == p.first) {           if (p.second <= Math.Max(p1.second, p2.second)            && (p.second >= Math.Min(p1.second, p2.second)))               // Point p lies between p1 and p2            return 1;    }       // If point p satisfies the equation    // of line joining p1 and p2    else {        val = (p.second - p1.second)                  * (p2.first - p1.first)              - (p.first - p1.first)                    * (p2.second - p1.second);           if (val == 0)            if ((p.first <= Math.Max(p1.first, p2.first)                 && (p.first >= Math.Min(p1.first, p2.first)))                && (p.second <= Math.Max(p1.second, p2.second)                    && (p.second >= Math.Min(p1.second, p2.second))))                return 1;    }       return 0;}   // Function to check if tower// of sight issue occurredstatic void towerOfSight(pair a,                  pair b,                  pair c,                  pair d){    int flag = 0;       if (checkIntersection(a, c, b) == 1)           // B lies between AC        flag = 1;       else if (checkIntersection(a, c, d) == 1)           // D lies between AC        flag = 1;       else if (checkIntersection(b, d, a) == 1)           // A lies between BD        flag = 1;       else if (checkIntersection(b, d, c) == 1)           // C lies between BD        flag = 1;       Console.Write(flag==1?"Yes\n":"No\n");}   // Driver codepublic static void Main(String[] args){    // Point A    pair a = new pair( 0, 0 );       // Point B    pair b = new pair( 0, -2 );       // Point C    pair c = new pair( 2, 0 );       // Point D    pair d = new pair( 0, 2 );       towerOfSight(a, b, c, d);   }} // This code is contributed by Princi Singh
<script>// Javascript program to check if tower// of sight issue occurs or not // Function to check if point p lies in// between the line joining p1 and p2function checkIntersection(p1,p2,p){    let val;        // If parallel to X-axis    if (p1[1] == p2[1]        && p1[1] == p[1]) {            if (p[0] <= Math.max(p1[0], p2[0])            && (p[0] >= Math.min(p1[0], p2[0])))                // Point p lies between p1 and p2            return 1;    }        // If parallel to Y-axis    if (p1[0] == p2[0]        && p1[0] == p[0]) {            if (p[1] <= Math.max(p1[1], p2[1])            && (p[1] >= Math.min(p1[1], p2[1])))                // Point p lies between p1 and p2            return 1;    }        // If point p satisfies the equation    // of line joining p1 and p2    else {        val = (p[1] - p1[1])                  * (p2[0] - p1[0])              - (p[0] - p1[0])                    * (p2[1] - p1[1]);            if (val == 0)            if ((p[0] <= Math.max(p1[0], p2[0])                 && (p[0] >= Math.min(p1[0], p2[0])))                && (p[1] <= Math.max(p1[1], p2[1])                    && (p[1] >= Math.min(p1[1], p2[1]))))                return 1;    }        return 0;} // Function to check if tower// of sight issue occurredfunction towerOfSight(a,b,c,d){    let flag = 0;        if (checkIntersection(a, c, b) == 1)            // B lies between AC        flag = 1;        else if (checkIntersection(a, c, d) == 1)            // D lies between AC        flag = 1;        else if (checkIntersection(b, d, a) == 1)            // A lies between BD        flag = 1;        else if (checkIntersection(b, d, c) == 1)            // C lies between BD        flag = 1;        document.write(flag==1?"Yes\n":"No\n");} // Driver code // Point Alet a=[0,0]; // Point Blet b=[0, -2 ]; // Point Clet c=[2, 0 ]; // Point Dlet d=[0, 2];towerOfSight(a, b, c, d); // This code is contributed by avanitrachhadiya2155</script>
Yes
 
Time Complexity: O(1)
Auxiliary Space: O(1)
ukasp
Rajput-Ji
princi singh
avanitrachhadiya2155
subham348
Geometric-Lines
Geometric
Mathematical
Write From Home
Mathematical
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Haversine formula to find distance between two points on a sphere
Program to find slope of a line
Program to find line passing through 2 Points
Equation of circle when three points on the circle are given
Maximum Manhattan distance between a distinct pair from N coordinates
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7