【问题标题】:Getting the overlapping area of two circles获取两个圆的重叠区域
【发布时间】:2014-12-16 16:52:02
【问题描述】:

我正在处理的一个咨询项目的最后一分钟请求让我陷入了极大的困境。

基本上这就是我想要完成的:

我有一个绘制一系列随机大小的圆圈的表面视图。每个圆的半径范围为 50-100。

x,y 值随随机半径随机生成

每个圆都被创建为代表该圆的对象(x、y 坐标和半径),并将其添加到列表中。

一旦它们全部被创建,它们就会被绘制出来。

问题是我想确保这些圆圈没有重叠。

我有点挣扎。这似乎不应该那么困难,但不幸的是对我来说。

这是我目前的代码(我知道它不接近......请善待):

    x = 100 + (int) (Math.random() * (mCanvasWidth - 200));
    y = 100 + (int) (Math.random() * (mCanvasHeight - 200));
    radius = 50 + (int) (Math.random() * 99);
    color[0] = (float) (Math.random() * 360);
    color[1] = 1;
    color[2] = 1;

    String radVal = String.valueOf(radius);

    circle circ = new circle(x, y, radius, Color.HSVToColor(128, color), radVal);

    boolean addit = true;



    for (dot d : Dots) {
        int leftSide = d.get_x() - radius;
        int rightSide = d.get_x() + radius;

        int xBoundary = x + radius;
        int yBoundary = y + radius;

        int exist_xLeft = d.get_x() - d.get_radius();
        int exist_xRight = d.get_x() + d.get_radius();
        int exist_yTop = d.get_y() - d.get_radius();
        int exist_yBottom = d.get_y() + d.get_radius();

        if ((xBoundary > exist_xLeft) && (xBoundary < exist_xRight))
        {
            if (yBoundary > (exist_yTop) && (yBoundary < exist_yBottom)) {
                addit = false;
                break;
            }
        }
    }

    if (addit)
        circles.add(mdot);

    if (circles.size() >= 5)
        running = false;

然后它会迭代圆圈列表并将它们绘制到画布上。

关于我在碰撞检测中失败的地方有什么建议吗?

【问题讨论】:

  • 这个答案给了我我需要的东西:stackoverflow.com/questions/306316/…
  • @markE 你能解释更多吗?我试图测试假设以下值的表达式:cx1=0; cy1=0; r1=5; cx2=9; cy2=0; r2=5;。在这种情况下是不是圆圈碰撞?
  • @markE - 感谢您的建议。我尝试了您的解决方案,但它不起作用。我仍然遇到重叠......尽管有轻微的重叠......仍然有重叠。
  • 您链接到的答案是检测矩形碰撞而不是圆形碰撞。它提供近似圆碰撞,但会给出误报(它表示圆在实际没有碰撞时发生碰撞)。您可以检测两个圆是否像这样碰撞:给定中心点 cx1,cy1 & cx2,cy2 并给定半径 r1 & r2, : areColliding=((cx2-cx1)*(cx2-cx1)+(cy2-cy1)*( cy2-cy1))
  • 完美运行!!!!我还可以补充一点,我的名字是 Mark Edward(姓氏)从一个 MarkE 到另一个...谢谢!

标签: android geometry collision-detection


【解决方案1】:

您可以像这样检测两个圆圈是否发生碰撞:

给定:

  • 中心点 cx1,cy1 & cx2,cy2

  • 并给定半径 r1 和 r2,

那么你就可以判断2个圆是否在碰撞:

areColliding=((cx2-cx1)*(cx2-cx1)+(cy2-cy1)*(cy2-cy1))<((r1+r2)*(r1+r2));

【讨论】:

  • 用简单的英语表达的意思是“如果两个中心点之间的距离小于半径之和,则圆正在碰撞。”
猜你喜欢
  • 2011-09-14
  • 2012-03-30
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多