【问题标题】:How to get the size of the intersecting part in a circle in Java如何在Java中获取圆中相交部分的大小
【发布时间】:2012-02-07 01:46:45
【问题描述】:

我需要这张图片黑色部分的大小:

我对如何在普通数学中找到它进行了一些研究,我被指向了这个网站:Website

得到它的最终答案是
(来自 MathWorld - A Wolfram 网络资源: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)。

我做错了什么?

【问题讨论】:

  • 我会使用double 而不是float,因为它的表示错误更少,但不足以解释你的错误。 ;)
  • 你能告诉我们 deltaX 和 Y 的公式,因为它们看起来不正确吗? getRadius() 和 getRadius1() 有什么区别?
  • 为什么会有getRadius1()和e.getRadius1()?你是不是忘了求 r 的半径?
  • 附带说明:尝试缓存 Math.pow(x, 2) 操作(其中 x 是 r、R 或 d),因为它使事情更容易阅读并提高性能(这些值被计算多次,并且它们在计算过程中不要改变,是吗?:))。
  • 示例问题。希望你不介意我的重新格式化,只是多一点空格并去掉代码块中的水平滚动条。请注意,使用 Markdown,您无需提供 <br/> 即可获得换行符。

标签: java math floating-point geometry


【解决方案1】:

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

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

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

编辑

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

【讨论】:

  • Math.acos(Math.toRadians(...)) 肯定是错误的,因为Math.acos() 的参数不是角度。 Math.acos() 的参数应该是一个介于 -1 和 1 之间的值,并且将返回一个以弧度为单位的值。
  • 您好,如何获得相交点?请在这里提出解决方案stackoverflow.com/questions/38177728/…
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多