首页 > 解决方案 > 有没有办法知道 3 个圆圈是否相交:Java - Android Studio?

问题描述

首先,我有3 个点A、B、C
这些点放在一个网格中。网格实际上是FrameLayout 中ImageView,它们都在RelativeLayout内 。这3 个点RelativeLayout上的位置,在网格的顶部。 现在这 3 个点代表每次具有不同半径圆心(没关系),所以当我放置 3 个点时,我在每个点周围画一个圆。 圆圈是这样绘制的:



            Drawable drawable = getResources().getDrawable(R.drawable.circle);
            GradientDrawable gradientDrawable = (GradientDrawable) drawable;
            gradientDrawable.setColor(getResources().getColor(android.R.color.transparent));
            gradientDrawable.setShape(GradientDrawable.OVAL);
            //Then scale it 
            gradientDrawable.setStroke(stroke,color);
            circles[i].setImageDrawable(gradientDrawable);

现在我现在这3 个点(x,y)以及它们的半径 有没有办法找到3 个圆是否在一个或多个像素中相交?编辑在一个点相交的 3 个圆的示例


标签: javaandroidandroid-studiogeometryandroid-drawable

解决方案


您有以下数据,代表您的 3 个圈子:

For each circle i=1,2,3:
Center: Ci = (ai, bi)
Radius: ri > 0

对于三个圆有一个共同的交点(x, y),该点必须是二次方程组的解:

(x - a1)^2 + (y - b1)^2 = r1^2
(x - a2)^2 + (y - b2)^2 = r2^2
(x - a3)^2 + (y - b3)^2 = r3^2

展开每个方程并重新排列各项:

x^2 + y^2 - 2*a1*x - 2*b1*y = r1^2 - a1^2 - b1^2
x^2 + y^2 - 2*a2*x - 2*b2*y = r2^2 - a2^2 - b2^2
x^2 + y^2 - 2*a3*x - 2*b3*y = r1^2 - a3^2 - b3^2

一个技巧是重写系统如下:

z - 2*a1*x - 2*b1*y = r1^2 - a1^2 - b1^2
z - 2*a2*x - 2*b2*y = r2^2 - a2^2 - b2^2
z - 2*a3*x - 2*b3*y = r1^2 - a3^2 - b3^2
x^2 + y^2 = z

它是三个线性方程和三个未知变量的超定系统(x, y, z),加上这三个变量之间的一个额外的二次方程x^2 + y^2 = z

因此,求解线性系统很容易,因此运行以下算法:

步骤 1: 减少线性系统

z - 2*a1*x - 2*b1*y = r1^2 - a1^2 - b1^2
z - 2*a2*x - 2*b2*y = r2^2 - a2^2 - b2^2
z - 2*a3*x - 2*b3*y = r1^2 - a3^2 - b3^2

通过从第二个和第三个方程中减去第一个方程:

z = 2*a1*x + 2*b1*y + r1^2 - a1^2 - b1^2
2*(a1-a2)*x + 2*(b1-b2)*y = r2^2 - a2^2 - b2^2 - r1^2 + a1^2 + b1^2
2*(a1-a3)*x + 2*(b1-b3)*y = r1^2 - a3^2 - b3^2 - r1^2 + a1^2 + b1^2

第 2 步:求解 (x, y) 的二乘二线性系统:

2*(a1-a2)*x + 2*(b1-b2)*y = r2^2 - a2^2 - b2^2 - r1^2 + a1^2 + b1^2
2*(a1-a3)*x + 2*(b1-b3)*y = r1^2 - a3^2 - b3^2 - r1^2 + a1^2 + b1^2

并找到解决方案(或解决方案,在某些退化的情况下,但通常应该只有一个解决方案)(x, y)

步骤 3:z通过替换公式中步骤 2 中的每个解决方案 来(x, y)计算:

z = 2*a1*x + 2*b1*y + r1^2 - a1^2 - b1^2

第 4 步: 检查是否

x^2 + y^2 = z

如果是,则三个圆相交于该点(x, y)。如果(x, y, z)步骤 3 中的解都不满足二次方程,则三个圆不相交。


推荐阅读