如何确定一个多边形是凸的还是凹的?

3
用户输入n个点。我需要检查多边形是否存在,然后确定其类型-凸多边形还是凹多边形。我知道如果多边形的每个角度都小于180度,则该多边形是凸多边形。因此,问题就是要找到多边形的每个内角。我一直在寻找公式或算法,但没有成功。
例子:
输入:n = 4;
点1: (5;6)
点2: (4;-5)
点3: (-5;4)
点4: (-5;5)
期望输出:多边形是凸多边形。

Example

目前的代码如下:它只能找到平面上点之间的最大和最小距离。

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
    double a[15][2];
    int n;
    cin >> n;
    if (n <= 0 && n > 15)
        return 1;

    for (int i = 0; i < n; i++)
    {
        cout << "x" << i << " = , y" << i << " = ";
        cin >> a[i][0] >> a[i][1];
    }

    double maxDistance = 0.0;
    double minDistance = 0.0;
    double maxpoint1[2];
    double maxpoint2[2];
    double minpoint1[2];
    double minpoint2[2];

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (j != i)
            {
                double x1 = a[i][0];
                double x2 = a[j][0];
                double y1 = a[i][1];
                double y2 = a[j][1];
                double currentDistance = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));

                if (currentDistance > maxDistance)
                {
                    maxDistance = currentDistance;
                    maxpoint1[0] = x1;
                    maxpoint1[1] = y1;
                    maxpoint2[0] = x2;
                    maxpoint2[1] = y2;

                }

                if (minDistance > currentDistance)
                {
                    currentDistance = minDistance;
                    minpoint1[0] = x1;
                    minpoint1[1] = y1;
                    minpoint2[0] = x2;
                    minpoint2[1] = y2;
                }

                cout << "x1 = " << x1 << " y1 = " << y1 << " x2 = " << x2 << " y2 = " << y2;
                cout << endl << "Distance is " << currentDistance;
                cout << endl;
            }
        }
    }

    cout << "The max distance is: " << maxDistance << " between x1 = " << maxpoint1[0] << " y1 = " << maxpoint1[1] << " and x2 = " << maxpoint2[0] << " y2 = " << maxpoint2[1];
    cout << "The min distance is: " << minDistance << " between x1 = " << minpoint1[0] << " y1 = " << minpoint1[1] << " and x2 = " << minpoint2[0] << " y2 = " << minpoint2[1];


    return 0;
}

2个回答

4

要判断多边形是凸多边形还是凹多边形,只需检查所有相邻的三个点的叉积的符号CrossProduct(P[0], P[1], P[2])等。例如

CrossProductSign(A, B, C) = 
               SignOf((B.X - A.X) * (C.Y - B.Y) - (B.Y - A.Y) * (C.X - B.X))

对于凸多边形,所有的叉积必须具有相同的符号(+ 或 -)。

工作原理:对于凸多边形,每个三元组都会朝着同一方向旋转(或者顺时针,或者逆时针,取决于行走方向)。对于凹多边形,一些符号将不同(当内角大于180度时)。请注意,您无需计算角度值。


2

如果您想找到两条边之间的夹角,请使用向量的叉积或点积。

a dot b = |a||b| cos(angle_between_vectors)  = a[0]*b[0] + a[1]*b[1] + a[2]*b[2]

内角将是(pi -向量间夹角)

顺便说一下,多边形可能会相交,这在许多用例中也是有害的问题。您的定义将无法检测到这一点。例如,复杂的四边形将使其所有角度都小于90度。

这不是确定多边形是否为凸多边形的唯一方法,而且可能是最计算密集的方法之一?点积的问题在于,它的符号将显示角度是否小于还是大于pi/2。判断多边形是否不复杂或非凸的正确方法是检查转向是否改变。为此,您需要进行叉积计算。对于二维向量,它们的叉积结果只有z分量(垂直于平面),其符号确定旋转方向。

该问题已经在此处。

如何高效地确定多边形是凸多边形、非凸多边形还是复杂多边形?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接