【发布时间】: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