有没有办法知道3个圆是否相交于一点 : Java - Android Studio?

问题描述 投票:0回答:1

首先我有 3分 : A,B,C 分数被放置在一个 网格. 网格实际上是一个 图像视图 在...中 框架布局 而他们都在一个 相对布局3分 的地方 相对布局, 在...之上网格. 现在这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);

现在我把这两个 的(x,y)3分 以及 其半径 是否有办法找到 3个圆圈相交于一个或多个像素? 编辑: 3个圆相交于一点的例子

java android android-studio geometry android-drawable
1个回答
0
投票

你有以下数据,代表你的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.

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

第一步:减少线性系统

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

第二步: 解二乘二线性系统(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).

第三步:计算 z 取而代之的是 (x, y) 从步骤2的公式中。

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

第四步:检查是否

x^2 + y^2 = z

如果是的话,那么这三个圆就交于 (x, y). 如果没有任何解决办法 (x, y, z) 从步骤3满足二次方程,那么三个圆不相交。

© www.soinside.com 2019 - 2024. All rights reserved.