首页 > 解决方案 > 我们如何计算正多边形内最大圆的直径?

问题描述

我一直在训练以下编程练习:多边形中的圆圈。声明是:

您是一家制盒公司的所有者。

您的公司可以生产任何等边多边形盒子,但您的很多客户都希望在这些盒子中运输圆形物体。圆圈是消费行业中非常常见的形状。锡罐、眼镜、轮胎和 CD 就是其中的几个例子。

因此,您决定在您的盒子上添加以下信息:可以放入给定盒子的最大(直径)圆形对象。

我找到了以下公式: 在此处输入图像描述

取自:https ://www.mathopenref.com/polygonincircle.html

因此,要计算最大内圆的直径,我们有:

sideLength / tan(180/numberOfSides)

我写了以下代码:

public class Polygon {
    int sides;
    int sideLength;

    public Polygon(int sides, int sideLength) {
        this.sides = sides;
        this.sideLength = sideLength;
    }

    public double circleDiameter /**/(){
      double div = Math.toRadians(180/sides);
      System.out.println("div: "+div);
      double den = Math.tan(div);
      System.out.println("den: "+den);
      double diameter = sideLength / den;
      System.out.println("diameter: "+diameter);
      return diameter;
    }

}

但是我想知道为什么它没有通过一项测试并通过了其中两项。以下是从练习中提取的测试:

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class PolygonTest {

    @Test
    public void test1(){
        //Square with sides of 5 units
        Polygon poly=new Polygon(4, 5);
        assertEquals("5.000", String.format("%.3f", poly.circleDiameter()));
    }

    @Test
    public void test2() {
        //Octagon with sides of 9 units
        Polygon poly=new Polygon(8, 9);
        assertEquals("21.728", String.format("%.3f", poly.circleDiameter()));
    }

    @Test
    public void test3() {
        //Triangle with sides of 4 units
        Polygon poly=new Polygon(3, 4);
        assertEquals("2.309", String.format("%.3f", poly.circleDiameter()));
    }
}

我们的代码未能通过 Octagon 测试。痕迹是:

div: 0.3839724354387525
den: 0.4040262258351568
diameter: 22.275781680746665
expected:<2[1.728]> but was:<2[2.276]>

为什么代码会给出这个结果?我认为可能存在舍入错误。但是它太大了,我认为这是错误的公式。

我也读过:

标签: javamathgeometryintrounding

解决方案


double div = Math.toRadians(180/sides);

什么时候sides是 8,结果应该是 22.5,但是因为 180 和sides都是整数,所以计算是使用整数数学完成的,产生 22。

将一个或两个操作数更改为双精度数,以确保不会出现意外舍入:

double div = Math.toRadians(180.0/sides);

推荐阅读