📜  检查给定的多边形是否是凸多边形

📅  最后修改于: 2021-04-22 03:30:45             🧑  作者: Mango

给定2D数组point [] [] ,其每一行的格式为{X,Y} ,分别表示顺时针或逆时针序列的多边形坐标,任务是检查多边形是否为凸多边形。 。如果发现是真的,则打印“是” 。否则,打印“否”

例子:

方法:请按照以下步骤解决问题:

  • 遍历数组并检查多边形的任意两个相邻边的叉积方向是否相同。如果发现是真的,则打印“是”
  • 否则,打印“否”

下面是上述方法的实现:

C++
// C++ program to implement
// the above approach
 
#include 
using namespace std;
 
// Utility function to find cross product
// of two vectors
int CrossProduct(vector >& A)
{
    // Stores cofficient of X
    // direction of vector A[1]A[0]
    int X1 = (A[1][0] - A[0][0]);
 
    // Stores cofficient of Y
    // direction of vector A[1]A[0]
    int Y1 = (A[1][1] - A[0][1]);
 
    // Stores cofficient of X
    // direction of vector A[2]A[0]
    int X2 = (A[2][0] - A[0][0]);
 
    // Stores cofficient of Y
    // direction of vector A[2]A[0]
    int Y2 = (A[2][1] - A[0][1]);
 
    // Return cross product
    return (X1 * Y2 - Y1 * X2);
}
 
// Function to check if the polygon is
// convex polygon or not
bool isConvex(vector >& points)
{
    // Stores count of
    // edges in polygon
    int N = points.size();
 
    // Stores direction of cross product
    // of previous traversed edges
    int prev = 0;
 
    // Stores direction of cross product
    // of current traversed edges
    int curr = 0;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // Stores three adjacent edges
        // of the polygon
        vector > temp
            = { points[i],
                points[(i + 1) % N],
                points[(i + 2) % N] };
 
        // Update curr
        curr = CrossProduct(temp);
 
        // If curr is not equal to 0
        if (curr != 0) {
 
            // If direction of cross product of
            // all adjacent edges are not same
            if (curr * prev < 0) {
                return false;
            }
            else {
                // Update curr
                prev = curr;
            }
        }
    }
    return true;
}
 
// Driver code
int main()
{
    vector > points
        = { { 0, 0 }, { 0, 1 },
            { 1, 1 }, { 1, 0 } };
 
    if (isConvex(points)) {
        cout << "Yes"
             << "\n";
    }
    else {
        cout << "No"
             << "\n";
    }
}


Java
// Java program to implement
// the above approach
class GFG
{
   
// Utility function to find cross product
// of two vectors
static int CrossProduct(int A[][])
{
    // Stores cofficient of X
    // direction of vector A[1]A[0]
    int X1 = (A[1][0] - A[0][0]);
 
    // Stores cofficient of Y
    // direction of vector A[1]A[0]
    int Y1 = (A[1][1] - A[0][1]);
 
    // Stores cofficient of X
    // direction of vector A[2]A[0]
    int X2 = (A[2][0] - A[0][0]);
 
    // Stores cofficient of Y
    // direction of vector A[2]A[0]
    int Y2 = (A[2][1] - A[0][1]);
 
    // Return cross product
    return (X1 * Y2 - Y1 * X2);
}
 
// Function to check if the polygon is
// convex polygon or not
static boolean isConvex(int points[][])
{
    // Stores count of
    // edges in polygon
    int N = points.length;
 
    // Stores direction of cross product
    // of previous traversed edges
    int prev = 0;
 
    // Stores direction of cross product
    // of current traversed edges
    int curr = 0;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // Stores three adjacent edges
        // of the polygon
        int temp[][]= { points[i],
                points[(i + 1) % N],
                points[(i + 2) % N] };
 
        // Update curr
        curr = CrossProduct(temp);
 
        // If curr is not equal to 0
        if (curr != 0) {
 
            // If direction of cross product of
            // all adjacent edges are not same
            if (curr * prev < 0) {
                return false;
            }
            else {
                // Update curr
                prev = curr;
            }
        }
    }
    return true;
}
 
// Driver code
public static void main(String [] args)
{
    int points[][] = { { 0, 0 }, { 0, 1 },
            { 1, 1 }, { 1, 0 } };
 
    if (isConvex(points))
    {
        System.out.println("Yes");
    }
    else
    {
        System.out.println("No");
    }
}
}
 
// This code is contributed by chitranayal


Python3
# Python3 program to implement
# the above approach
 
# Utility function to find cross product
# of two vectors
def CrossProduct(A):
     
    # Stores cofficient of X
    # direction of vector A[1]A[0]
    X1 = (A[1][0] - A[0][0])
 
    # Stores cofficient of Y
    # direction of vector A[1]A[0]
    Y1 = (A[1][1] - A[0][1])
 
    # Stores cofficient of X
    # direction of vector A[2]A[0]
    X2 = (A[2][0] - A[0][0])
 
    # Stores cofficient of Y
    # direction of vector A[2]A[0]
    Y2 = (A[2][1] - A[0][1])
 
    # Return cross product
    return (X1 * Y2 - Y1 * X2)
 
# Function to check if the polygon is
# convex polygon or not
def isConvex(points):
     
    # Stores count of
    # edges in polygon
    N = len(points)
 
    # Stores direction of cross product
    # of previous traversed edges
    prev = 0
 
    # Stores direction of cross product
    # of current traversed edges
    curr = 0
 
    # Traverse the array
    for i in range(N):
         
        # Stores three adjacent edges
        # of the polygon
        temp = [points[i], points[(i + 1) % N],
                           points[(i + 2) % N]]
 
        # Update curr
        curr = CrossProduct(temp)
 
        # If curr is not equal to 0
        if (curr != 0):
             
            # If direction of cross product of
            # all adjacent edges are not same
            if (curr * prev < 0):
                return False
            else:
                 
                # Update curr
                prev = curr
 
    return True
 
# Driver code
if __name__ == '__main__':
     
    points = [ [ 0, 0 ], [ 0, 1 ],
               [ 1, 1 ], [ 1, 0 ] ]
 
    if (isConvex(points)):
        print("Yes")
    else:
        print("No")
 
# This code is contributed by SURENDRA_GANGWAR


C#
// C# program to implement
// the above approach
using System;
 
class GFG
{
   
// Utility function to find cross product
// of two vectors
static int CrossProduct(int [,]A)
{
    // Stores cofficient of X
    // direction of vector A[1]A[0]
    int X1 = (A[1, 0] - A[0, 0]);
 
    // Stores cofficient of Y
    // direction of vector A[1]A[0]
    int Y1 = (A[1, 1] - A[0, 1]);
 
    // Stores cofficient of X
    // direction of vector A[2]A[0]
    int X2 = (A[2, 0] - A[0, 0]);
 
    // Stores cofficient of Y
    // direction of vector A[2]A[0]
    int Y2 = (A[2, 1] - A[0, 1]);
 
    // Return cross product
    return (X1 * Y2 - Y1 * X2);
}
 
// Function to check if the polygon is
// convex polygon or not
static bool isConvex(int [,]points)
{
    // Stores count of
    // edges in polygon
    int N = points.GetLength(0);
 
    // Stores direction of cross product
    // of previous traversed edges
    int prev = 0;
 
    // Stores direction of cross product
    // of current traversed edges
    int curr = 0;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // Stores three adjacent edges
        // of the polygon
        int []temp1 = GetRow(points, i);
        int []temp2 = GetRow(points, (i + 1) % N);
        int []temp3 = GetRow(points, (i + 2) % N);
        int [,]temp = new int[points.GetLength(0),points.GetLength(1)];
        temp = newTempIn(points, temp1, temp2, temp3);
 
        // Update curr
        curr = CrossProduct(temp);
 
        // If curr is not equal to 0
        if (curr != 0) {
 
            // If direction of cross product of
            // all adjacent edges are not same
            if (curr * prev < 0) {
                return false;
            }
            else {
                // Update curr
                prev = curr;
            }
        }
    }
    return true;
}
public static int[] GetRow(int[,] matrix, int row)
  {
    var rowLength = matrix.GetLength(1);
    var rowVector = new int[rowLength];
 
    for (var i = 0; i < rowLength; i++)
      rowVector[i] = matrix[row, i];
 
    return rowVector;
  }
    public static int[,] newTempIn(int[,] points, int []row1,int []row2, int []row3)
  {
    int [,]temp= new int[points.GetLength(0), points.GetLength(1)];
 
    for (var i = 0; i < row1.Length; i++){
          temp[0, i] = row1[i];
        temp[1, i] = row2[i];
        temp[2, i] = row3[i];
    }
    return temp;
  }
     
     
// Driver code
public static void Main(String [] args)
{
    int [,]points = { { 0, 0 }, { 0, 1 },
            { 1, 1 }, { 1, 0 } };
 
    if (isConvex(points))
    {
        Console.WriteLine("Yes");
    }
    else
    {
        Console.WriteLine("No");
    }
}
}
 
// This code is contributed by 29AjayKumar


Javascript


输出:
Yes

时间复杂度: O(N)
辅助空间: O(1)