鉴于三个圆的中心点和半径,你如何定义交叉区域?
到目前为止我所拥有的是:
var point1 = {x: -3, y: 0};
var point2 = {x: 3, y: 0};
var point3 = {x: 0, y: -3};
var r1 = 5;
var r2 = 5;
var r3 = 5;
var area = returnIntersectionArea(point1, point2, point3, r1, r2, r3);
此外,如果两个碰撞但不碰撞第三个,则该函数应返回null。 如果没有碰撞,则应返回null。
答案 0 :(得分:3)
This article描述了如何找到两个圆圈之间的交点区域。结果很容易扩展到三个圈子。
------------- ------------- EDIT 好吧,问题不容易扩展到三个圈子,我在这个问题上找到了博士论文。假设三个圆相交如下所示,可以找到近似解(我认为)。在我们尝试之前,我们必须检查三个圆圈是否确实相交,如下所示。如果说一个圆在另一个圆内,第三个圆与它们相交,问题就会发生很大变化。
。
A + D + F + G = A + D + X1 = S1
B + D + E + G = B + D + X3 = S2
B + E + D + G = B + E + X2 = S3
这是不确定的,但可以使用最小二乘法找到近似解。我没有在数字上尝试过,但我会尽快回复你:D 如果最小二乘解决方案看似错误,我们也应该施加一些限制,例如:如果任何一对圆之间的交点小于圆的面积,则该区域。 评论很感激。
西蒙的PS +1指出我不应该把事情看作是轻松的
答案 1 :(得分:1)
解决此问题的一种方法是通过Monte Carlo模拟:
function returnIntersectionArea(point1, point2, point3, r1, r2, r3) {
// determine bounding rectangle
var left = Math.min(point1.x - r1, point2.x - r2, point3.x - r3);
var right = Math.max(point1.x + r1, point2.x + r2, point3.x + r3);
var top = Math.min(point1.y - r1, point2.y - r2, point3.y - r3);
var bottom = Math.max(point1.y + r1, point2.y + r2, point3.y + r3);
// area of bounding rectangle
var rectArea = (right - left) * (bottom - top);
var iterations = 10000;
var pts = 0;
for (int i=0; i<iterations; i++) {
// random point coordinates
var x = left + Math.rand() * (right - left);
var y = top + Math.rand() * (bottom - top);
// check if it is inside all the three circles (the intersecting area)
if (Math.sqrt(Math.pow(x - point1.x, 2) + Math.pow(y - point1.y, 2)) <= r1 &&
Math.sqrt(Math.pow(x - point2.x, 2) + Math.pow(y - point2.y, 2)) <= r2 &&
Math.sqrt(Math.pow(x - point3.x, 2) + Math.pow(y - point3.y, 2)) <= r3)
pts++;
}
// the ratio of points inside the intersecting area will converge to the ratio
// of the area of the bounding rectangle and the intersection
return pts / iterations * rectArea;
}
通过增加迭代次数,可以将解决方案提高到任意精度(在浮点范围内),但解决方案的速度可能会变慢。显然,选择紧密的边界框对于实现良好的收敛非常重要。