java - 有没有办法知道 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 个圆的示例
解决方案
您有以下数据,代表您的 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 中的解都不满足二次方程,则三个圆不相交。
推荐阅读
- java - libfontmanager.so 中的符号 FT_Library_SetLcdFilter 未找到错误:Openjdk JRE
- node.js - 如何在猫鼬排序中使用变量?
- uicollectionview - 我想在 Swift 的 UICollectionView 中为特定部分创建粘性标题
- php - PHP 错误:在 laravel 8 修补程序中找不到类“页面”
- unit-testing - 使用 quarkus-smallrye-graphql 进行单元测试
- huawei-mobile-services - 在华为开发者控制台上尝试在云调试中创建设备时遇到错误
- javascript - 如何单击 cypress 中的 img 元素以获取附加代码
- sql - 除法输出计算值
- c++ - 存储一个每隔一个元素为 0 的矩阵
- google-bigquery - BigQuery 批量查询类似于 JDBC addBatch() 和 executeBatch()