Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何确定多边形的类型_C++_Algorithm_Geometry_Polygon_Coordinate Systems - Fatal编程技术网

C++ 如何确定多边形的类型

C++ 如何确定多边形的类型,c++,algorithm,geometry,polygon,coordinate-systems,C++,Algorithm,Geometry,Polygon,Coordinate Systems,用户输入第n个点。我需要检查多边形是否存在,然后确定类型-凹多边形或凸多边形。我知道一个多边形是凸的,如果它的每个角度都小于180度。所以问题归结为找到多边形的每个内角。我一直在寻找公式或算法,但没有成功 示例: 输入:n=4 第1点:(5;6) 第2点:(4;-5) 第3点:(-5;4) 第4点:(-5;5) 预期输出:多边形是凸的 这是迄今为止的代码:现在它只找到平面中各点之间的最大和最小距离 #include "stdafx.h" #include <iostream> us

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

示例:

输入:n=4

第1点:(5;6)

第2点:(4;-5)

第3点:(-5;4)

第4点:(-5;5)

预期输出:多边形是凸的

这是迄今为止的代码:现在它只找到平面中各点之间的最大和最小距离

#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;
}
#包括“stdafx.h”
#包括
使用名称空间std;
int main()
{
双a[15][2];
int n;
cin>>n;
如果(第15条)
返回1;
对于(int i=0;icurrentDistance)
{
当前距离=距离;
minpoint1[0]=x1;
minpoint1[1]=y1;
minpoint2[0]=x2;
minpoint2[1]=y2;
}

cout如果你想找到两边之间的角度,可以使用向量的叉积或点积

a点b=| a | | b | cos(_向量之间的角度)=a[0]*b[0]+a[1]*b[1]+a[2]*b[2]

内角为(π-向量之间的角度)

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

这不是确定多边形是否为凸多边形的唯一方法,而且可能是计算量最大的方法之一? 点积的问题是,它的符号会显示角度是否小于或大于pi/2。确定多边形是否复杂或非凸的正确方法是检查旋转方向是否改变。为此,需要叉积。对于二维向量,叉积的结果仅得到z分量(垂直于平面),它的符号决定了旋转的方向

问题已经在这里了


要确定多边形是凸多边形还是凹多边形,只需检查所有连续点三元组的叉积符号
叉积(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))
对于凸1,所有叉积必须具有相同的符号(+或-)

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