📜  嵌入在 N 边正多边形中的正方形的最小边

📅  最后修改于: 2021-10-23 08:53:53             🧑  作者: Mango

给定一个偶数N ,它表示具有N个顶点的正多边形的边数,任务是找到最小尺寸的正方形,使得给定的多边形可以完全嵌入正方形中。

嵌入:多边形放置在正方形中,使位于N边界内或边界上的每个点也应位于正方形边界内或边界上。
例子:

方法:这个想法是观察在 3-D 平面上,当一个多边形嵌入一个正方形时,它可能会被旋转。六边形问题和八边形问题中已经讨论了类似的方法。因此,我们使用数学函数sin()cos()对轴上的每一边进行投影。所有投影的总和是此问题所需的正方形的最小边。
下面是上述方法的实现:

C++
// C++ program to find the minimum
// side of the square in which
// a regular polygon with even sides
// can completely embed
 
#include 
using namespace std;
 
// PI value in C++ using
// acos function
const double pi = acos(-1.0);
 
// Function to find the minimum
// side of the square in which
// a regular polygon with even sides
// can completely embed
double nGon(int N)
{
 
    // Projection angle variation
    // from axes
    double proAngleVar;
 
    // Projection angle variation
    // when the number of
    // sides are in multiple of 4
    if (N % 4 == 0) {
        proAngleVar
            = pi * (180.0 / N)
              / 180;
    }
    else {
        proAngleVar
            = pi * (180.0 / (2 * N))
              / 180;
    }
 
    // Distance between the end points
    double negX = 1.0e+99,
           posX = -1.0e+99,
           negY = 1.0e+99,
           posY = -1.0e+99;
 
    for (int j = 0; j < N; ++j) {
 
        // Projection from all N points
        // on X-axis
        double px = cos(2 * pi * j / N
                        + proAngleVar);
 
        // Projection from all N points
        // on Y-axis
        double py = sin(2 * pi * j / N
                        + proAngleVar);
 
        negX = min(negX, px);
        posX = max(posX, px);
        negY = min(negY, py);
        posY = max(posY, py);
    }
 
    // Maximum side
    double opt2 = max(posX - negX,
                      posY - negY);
 
    // Return the portion of side
    // forming the square
    return (double)opt2
           / sin(pi / N) / 2;
}
 
// Driver code
int main()
{
    int N = 10;
    cout << nGon(N);
    return 0;
}


Java
// Java program to find the minimum
// side of the square in which
// a regular polygon with even sides
// can completely embed
class GFG{
 
// PI value in Java using
// acos function
static double pi = Math.acos(-1.0);
 
// Function to find the minimum
// side of the square in which
// a regular polygon with even sides
// can completely embed
static double nGon(int N)
{
 
    // Projection angle variation
    // from axes
    double proAngleVar;
 
    // Projection angle variation
    // when the number of
    // sides are in multiple of 4
    if (N % 4 == 0)
    {
        proAngleVar = pi * (180.0 / N) / 180;
    }
    else
    {
        proAngleVar = pi * (180.0 / (2 * N)) / 180;
    }
 
    // Distance between the end points
    double negX = 1.0e+99,
           posX = -1.0e+99,
           negY = 1.0e+99,
           posY = -1.0e+99;
 
    for (int j = 0; j < N; ++j)
    {
 
        // Projection from all N points
        // on X-axis
        double px = Math.cos(2 * pi * j / N +
                                proAngleVar);
 
        // Projection from all N points
        // on Y-axis
        double py = Math.sin(2 * pi * j / N +
                                proAngleVar);
 
        negX = Math.min(negX, px);
        posX = Math.max(posX, px);
        negY = Math.min(negY, py);
        posY = Math.max(posY, py);
    }
 
    // Maximum side
    double opt2 = Math.max(posX - negX,
                           posY - negY);
 
    // Return the portion of side
    // forming the square
    return (double)opt2 /
            Math.sin(pi / N) / 2;
}
 
// Driver code
public static void main(String[] args)
{
    int N = 10;
    System.out.printf("%.5f",nGon(N));
}
}
 
// This code is contributed by 29AjayKumar


Python3
# Python 3 program to find the minimum
# side of the square in which
# a regular polygon with even sides
# can completely embed
import math
 
# PI value in Python 3 using
# acos function
pi = math.acos(-1.0)
 
# Function to find the minimum
# side of the square in which
# a regular polygon with even sides
# can completely embed
def nGon(N):
 
    # Projection angle variation
    # from axes
    proAngleVar = 0
 
    # Projection angle variation
    # when the number of
    # sides are in multiple of 4
    if (N % 4 == 0):
        proAngleVar = (pi * (180.0 / N)
                       / 180)
 
    else:
        proAngleVar = (pi * (180.0 / (2 * N))
                       / 180)
 
    # Distance between the end points
    negX = 1.0e+99
    posX = -1.0e+99
    negY = 1.0e+99
    posY = -1.0e+99
 
    for j in range(N):
 
        # Projection from all N points
        # on X-axis
        px = math.cos(2 * pi * j / N
                      + proAngleVar)
 
        # Projection from all N points
        # on Y-axis
        py = math.sin(2 * pi * j / N
                      + proAngleVar)
 
        negX = min(negX, px)
        posX = max(posX, px)
        negY = min(negY, py)
        posY = max(posY, py)
 
    # Maximum side
    opt2 = max(posX - negX,
               posY - negY)
 
    # Return the portion of side
    # forming the square
    return (opt2 / math.sin(pi / N) / 2)
 
# Driver code
if __name__ == "__main__":
 
    N = 10
    print('%.5f'%nGon(N))
 
    # This code is contributed by ukasp.


C#
// C# program to find the minimum
// side of the square in which
// a regular polygon with even sides
// can completely embed
using System;
class GFG{
 
// PI value in Java using
// acos function
static double pi = Math.Acos(-1.0);
 
// Function to find the minimum
// side of the square in which
// a regular polygon with even sides
// can completely embed
static double nGon(int N)
{
 
    // Projection angle variation
    // from axes
    double proAngleVar;
 
    // Projection angle variation
    // when the number of
    // sides are in multiple of 4
    if (N % 4 == 0)
    {
        proAngleVar = pi * (180.0 / N) / 180;
    }
    else
    {
        proAngleVar = pi * (180.0 / (2 * N)) / 180;
    }
 
    // Distance between the end points
    double negX = 1.0e+99,
           posX = -1.0e+99,
           negY = 1.0e+99,
           posY = -1.0e+99;
 
    for (int j = 0; j < N; ++j)
    {
 
        // Projection from all N points
        // on X-axis
        double px = Math.Cos(2 * pi * j / N +
                                proAngleVar);
 
        // Projection from all N points
        // on Y-axis
        double py = Math.Sin(2 * pi * j / N +
                                proAngleVar);
 
        negX = Math.Min(negX, px);
        posX = Math.Max(posX, px);
        negY = Math.Min(negY, py);
        posY = Math.Max(posY, py);
    }
 
    // Maximum side
    double opt2 = Math.Max(posX - negX,
                           posY - negY);
 
    // Return the portion of side
    // forming the square
    return (double)opt2 /
            Math.Sin(pi / N) / 2;
}
 
// Driver code
public static void Main()
{
    int N = 10;
    Console.Write(string.Format("{0:F5}", nGon(N)));
}
}
 
// This code is contributed by Nidhi_biet


Javascript


输出:
3.19623

时间复杂度: O(N) ,其中 N 是多边形的边数。