如何确定多边形的类型

时间:2016-11-22 09:23:39

标签: c++ algorithm geometry polygon coordinate-systems

用户输入第n个点。我需要检查是否存在多边形,然后确定类型 - 凹面或凸面多边形。我知道如果多边形的每个角度都在180度以下,那么它就是凸面。所以问题归结为找到多边形的每个内角。我一直在寻找公式或算法,但没有成功。

示例:

输入:n = 4;

Point1:(5; 6)

Point2:(4; -5)

Point3:( - 5; 4)

Point4:( - 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 个答案:

答案 0 :(得分:3)

要查找多边形是凸面还是凹面,只需检查所有连续点三元组CrossProduct(P[0], P[1], P[2]) etc的交叉积的符号。例如

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

对于凸面,所有交叉产品必须具有相同的符号(+或 - )。

工作原理:对于凸多边形,每个三元组在同一侧(或CW,或CCW,取决于行走方向)转弯。对于凹形,有些标志会有所不同(内角超过180度)。请注意,您无需计算角度值。

答案 1 :(得分:1)

如果要在两边找到角度,请使用向量的十字或点积。

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

内角将是(pi-angle_between_vectors)

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

这不是确定多边形是否凸出的唯一方法,可能是大多数计算丰富的多边形之一? 点积的问题在于,如果角度小于或大于pi / 2,则其符号将显示。确定多边形是非复杂还是非凸面的正确方法是检查转弯方向是否发生变化。为此你需要跨产品。对于2D矢量,它们的交叉乘积的结果只得到z分量(垂直于平面),它的符号决定了旋转发生的方式。

问题就在这里。

How do determine if a polygon is complex/convex/nonconvex?