这是我第一次在这里发帖,所以如果我遗漏信息或提供太多信息,或者其他方面搞砸了,我会道歉。如果我这样做,请告诉我。
所以我有一个圆圈列表,其中很多可能会重叠。 我正在检测重叠(鼻子是我的类,它指定了圆的大小(半径)和位置):
public boolean isSame(Nose other)
{
// if the difference between their X and Y positions are both
// less than half the combined sizes...
if (Math.abs(other.x - x) < (other.size + size) &&
Math.abs(other.y - y) < (other.size + size) )
return true;
else
return false;
}
我认为如果圆圈接近但不一定重叠,这应该返回true。这就是我想要的应用程序(对于那些想要真正重叠的人来说,这个的最佳答案将有助于:) How to detect overlapping circles and fill color accordingly?
考虑到这一点&#34;重叠&#34;检测,我试图结合&#34;重叠&#34;带有以下代码的列表中的圆圈(鼻子是ListArray):
for (int i = 0; i < noses.size(); i++)
{
//for each nose after the current one, check for redundant noses
for (int j = i+1; j < noses.size(); j++)
{
Nose noseI = noses.get(i);
Nose noseJ = noses.get(j);
if (noseI.isSame(noseJ))
{
noses.set(i, new Nose((noseI.x + noseJ.x),
(noseI.y + noseJ.y),
(noseI.size + noseJ.size)));
noses.remove(j);
j--; // decrement back to check the nose that is NOW at that place.
}
}
Nose noseI = noses.get(i).getBig();
//Add noses[i] to the image being returned
canvas.drawCircle((float)(noseI.x), (float)(noseI.y), (float)(noseI.size), paint);
}
我相信这种循环查找like-elements并将它们组合的方法应该正常工作,因为以下代码可以正常工作(从combine items of list修改):
public static void main(String[] args) {
List<Integer> list = new LinkedList<>();
list.add(10);
list.add(80);
list.add(5);
list.add(30);
list.add(13);
list.add(18);
list.add(36);
System.out.println(list);
for (int i = 0; i < list.size(); i++)
{
for (int j = i + 1; j < list.size(); j++)
{
if (Math.abs(list.get(i) - list.get(j)) < 10)
{
Integer a = list.get(i);
Integer b = list.get(j);
list.set(i, (a + b) / 2);
list.remove(j);
j--;
}
}
}
System.out.println(list);
}
给出了输出:
[10, 80, 5, 30, 13, 18, 36]
[14, 80, 33]
但是,我的实际应用程序始终在其上绘制重叠的圆圈。我真的难以理解为什么,因为我已经用简单的整数检查了组合循环,而且我相当肯定我的重叠检测不应该有附近的圆圈彼此,所以当然不应该有任何重叠。
答案 0 :(得分:0)
重叠条件可按如下方式计算:
public boolean isSame(Nose other) {
double dx = other.x - x;
double dy = other.y - y;
double distance = Math.sqrt( dx*dx + dy*dy );
return distance < Math.max( size, other.size );
}
命名很重要isSame
没有意义,我建议overlaps
到位。