java - 如何在Java中获取圆中相交部分的大小

标签 java math floating-point geometry

我需要这张图片黑色部分的尺寸:
Image

我做了一些关于如何在普通数学中找到它的研究,我被指向了这个网站:Website

得到它的最终答案是 pict
(来自 MathWorld - A Wolfram Web 资源:wolfram.com)

其中 r 是第一个圆的半径,R 是第二个圆的半径,d 是两个圆心之间的距离。

我试图用来获取其大小的代码如下:

float r = getRadius1();
float R = e.getRadius1();
float deltaX = Math.abs((getX()  + getRadius()) - (e.getX() + e.getRadius()));
float deltaY =  Math.abs((getY()  + getRadius()) - (e.getY() + e.getRadius()));
float d = (float) Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));

float part, part2, part3;
//Chopping it in parts, because it's easier.

part = (float) (Math.pow(r,2) * Math.acos(
      Math.toRadians((Math.pow(d, 2) + Math.pow(r, 2) - Math.pow(R, 2))/(2*d*r))));

part2 = (float) (Math.pow(R,2) * Math.acos(
      Math.toRadians((Math.pow(d, 2) + Math.pow(R, 2) - Math.pow(r, 2))/(2*d*R))));

part3 = (float) (0.5 * Math.sqrt((-d + r + R) * (d+r-R) * (d-r+R) * (d+r+R)));

float res = part + part2 - part3; 

Main.log(res + "       " + part + " " + part2 + " " + part3+ "       "
         + r + " " + R  + " " + d);
//logs the data and System.out's it

我做了一些测试,输出是这样的:

1345.9663       621.6233 971.1231 246.78008       20.0 25.0 43.528286

所以这表明重叠部分的大小大于圆本身(即 r^2 * PI)。

我做错了什么?

最佳答案

只是一个猜测(如我的评论所述):尝试删除 Math.toRadians(...) 转换。

由于公式中不涉及度数而是涉及半径,因此我假设 cos-1(...) 的参数已经是弧度值。

如果我删除转换并运行您的代码,我会得到以下重叠区域大小:11.163887023925781 这似乎是合理的,因为两个中心之间的线上重叠段的长度是 20 + 25 - 43.5 = 1.5(近似值)

编辑:

如果我将距离设置为 5(较小的圆完全包含在较大的圆中但接触到它的边缘)我得到重叠区域大小 1256.63 这正是较小圆的面积( 202 * Π).如果距离小于半径差(即在你的情况下小于 5),计算似乎不起作用,但这可能只是数值表示的问题(普通数据类型可能无法表示一些中间结果)。

关于java - 如何在Java中获取圆中相交部分的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8806823/

相关文章:

algorithm - 最小面积四边形算法

javascript - 需要帮助来计算欧拉常数的近似值

c - strtod 如何转换我的参数?

floating-point - 0.1 + 0.7 != 0.8

java - 值聚类

java - ksoap2 复杂参数

java - 使用 $.getJSON 的 Struts2 json 响应结果未定义响应

java - 在坐标处射箭时考虑重力

matlab - 如何在 MATLAB 中的数组中存储多于 4 位小数

java - Box2d 内存泄漏