给定一个偶数N ,它表示具有N个顶点的正多边形的边数,任务是找到最小尺寸的正方形,使得给定的多边形可以完全嵌入正方形中。
A Polygon is a convex figure and has equal sides and equal angles. All sides have length 1.
嵌入:将多边形放置在正方形中,使位于N边界内或边界上的每个点也应位于正方形边界内或边界上。
例子:
Input: N = 4
Output: 1
Explanation:
Regular polygon with 4 Sides is square with side 1.
Given polygon can easily embed on the square with side 1.
Input: N = 6
Output: 1.931851653
Explanation :
Regular polygon with 6 Sides is Hexagon with side 1.
Given polygon can easily embed on the square with side 1.931851653.
方法:这个想法是观察在 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 是多边形的边数。