Нахождение круга внутри другого круга - PullRequest
11 голосов
/ 28 февраля 2012

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

(используются переменные 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");
}

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

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

Ответы [ 7 ]

14 голосов
/ 28 февраля 2012

вам просто нужно проверить внутреннюю часть перед наложением, поскольку расстояние для внутренней части <= расстояние для наложения </p>

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");
} 

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

9 голосов
/ 28 февраля 2012

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

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

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 и сделаете небольшую перестановку, вы получите ту же пару уравнений).

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

2 голосов
/ 28 февраля 2012

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

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");
}

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

2 голосов
/ 28 февраля 2012

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

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

  distance = sqrt( travelled_x_squared + travelled_y_squared );

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

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

Расстояние в контакте в r1 + r2.

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

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

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

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

2 голосов
/ 28 февраля 2012

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

1 голос
/ 28 февраля 2012

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

взять сумму радиуса двух кругов. скажем 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

0 голосов
/ 15 января 2014
/**
   *
   * @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;
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...