Поиск круга внутри другого круга

У меня проблемы. У меня есть задание, которое требует от меня найти, если второй круг перекрывается, внутри или ни второй круг. Однако у меня возникают проблемы с проверкой перекрытия и если второй круг находится внутри первого.

(используются переменные x1, x2, y1, y2, r1, r2, расстояние)

Вот что у меня есть:

if (distance > (r1 + r2)) {
        // No overlap
        System.out.println("Circle2 does not overlap Circle1");
    } else if (distance <= Math.abs(r1 + r2)) {
        // Overlap
        System.out.println("Circle2 overlaps Circle1");
    } else if ((distance <= Math.abs(r1 - r2)) {
        // Inside
        System.out.println("Circle2 is inside Circle1");
}

Я боюсь, что проблема связана с перекрывающимися и внутренними проверками, но я не могу понять, как правильно настроить его, чтобы я мог надежно проверить, находится ли второй круг внутри первого.

Любая помощь или совет будут очень благодарны, поскольку я пробовал несколько подходов, но решение просто ускользает от меня каждый раз.

Ответ 1

вам просто нужно проверить внутри перед перекрытием, так как расстояние внутри внутри - <= расстояние для перекрытия

if (distance > (r1 + r2)) 
{
    // No overlap
    System.out.println("Circle2 does not overlap Circle1");
}
else if ((distance <= Math.abs(r1 - r2)) 
{
    // Inside
    System.out.println("Circle2 is inside Circle1");
}
else              // if (distance <= r1 + r2)
{
   // Overlap
   System.out.println("Circle2 overlaps Circle1");
} 

ответ изменен согласно комментариям Криса

Ответ 2

Эта проблема, вероятно, проще всего проработана визуально сначала, а затем написанный код. Вы выглядите так, как будто у вас есть правильная логика не внутри, а внутри.

Простым способом борьбы с этим является то, что если они не полностью внутри и не полностью снаружи, они должны перекрываться. Это, конечно, как я его кодирую. Математика немного сложнее, чем две другие.

if (distance > (r1 + r2)) {
    // No overlap
    System.out.println("Circle2 does not overlap Circle1");
} else if ((distance <= Math.abs(r1 - r2)) {
    // Inside
    System.out.println("Circle2 is inside Circle1");
{ else {
    // Overlap
    System.out.println("Circle2 overlaps Circle1");
}

Фактическое условие:

r2>r1-d и r2 < r1+d

По симметричности нам не нужно делать оба пути круглыми (если вы меняете r2 и r1 в обоих и выполняете немного перегруппировки, вы получаете одну и ту же пару уравнений).

Проще всего просто оставить это в категории "else", а не кодировать его, если вам не по какой-то причине.

Ответ 3

Хорошо, если сумма расстояния и меньшего радиуса меньше, чем другой радиус, меньший круг должен быть внутри большего.

Ответ 4

Изменить для очевидности прокси-сервера комментариев:

Расстояние между точками в пространстве описывается пифагорами:

  distance = sqrt( travelled_x_squared + travelled_y_squared );

Что, конечно, переводит на код как

  distance = Math.sqrt(  (x1-x2)*(x1-x2) + (y1 - y2)*(y1 - y2) );

Расстояние находится в контакте при r1 + r2.

Перед редактированием подсказок: Вам нужен угол между кругами.

Затем вы вычисляете расстояние от круга1 до круга 2. Если оно меньше радиусов1 + радиусов 2, вы находитесь внутри.

atan2 может быть интересной функцией.

Или просто пойдите с пифагорейским расстоянием напрямую.

Ответ 5

Ты почти там. Это просто порядок неправильных условий.

if (distance > (r1 + r2)) {
        // No overlap
        System.out.println("Circle2 does not overlap Circle1");
    } else if ((distance <= Math.abs(r1 - r2)) {
        // Inside
        System.out.println("Circle2 is inside Circle1");
    } else {
        // Overlap
        System.out.println("Circle2 overlaps Circle1");
}

Проверка "внутреннего" случая после "неперекрывающегося" случая гарантирует, что он не будет случайно рассматриваться как перекрытие. Тогда все остальные должны быть перекрытиями.

Ответ 6

Это простая задача,

возьмем сумму радиуса двух окружностей. r1 + r2. Теперь найдите расстояние между центром двух окружностей, которое представляет собой sqrt ((x1-x2) ^ 2 + (y1-y2) ^ 2) if r1+r2 = sqrt((x1-x2)^2 + (y1-y2)^2) they just touch each other. if r1+r2 > sqrt((x1-x2)^2 + (y1-y2)^2) the circle overlaps(intersect) if r1+ r2 < sqrt((x1-x2)^2 + (y1-y2)^2) the circle doesnot intersect

Ответ 7

/**
   *
   * @param values { x0, y0, r0, x1, y1, r1 }
   * @return true if circles is intersected
   */
  public static boolean isCircleIntersect(double... values)
  {
    /* check using mathematical relation: ABS(R0-R1) <= SQRT((x0-x1)^2+(y0-y1)^2) <= (R0+R1) */
    if (values.length == 6)
    {
      /* get values from first circle */
      double x0 = values[0];
      double y0 = values[1];
      double r0 = values[2];
      /* get values from second circle */
      double x1 = values[3];
      double y1 = values[4];
      double r1 = values[5];
      /* returun result */
      return (Math.abs(r0 - r1) <= Math.sqrt(Math.pow((x0 - x1), 2) + Math.pow((y0 - y1), 2)))
              && (Math.sqrt(Math.pow((x0 - x1), 2) + Math.pow((y0 - y1), 2)) <= (r0 + r1));
    }
    else
    {
      /* return default result */
      return false;
    }
  }