2012-02-28 3 views
10

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

(переменные, используемые 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

Во-первых - какое расстояние? Это расстояние между центрами кругов? Во-вторых - может ли это помочь выяснить, какой радиус больше? – user1118321

+0

Все переменные вводятся пользователем. Да, расстояние - это расстояние между двумя центрами двух окружностей с формулой расстояния. – Battleroid

+0

Я просто искал эту проблему и нашел это http://gamedev.stackexchange.com/questions/7172/how-to-find-out-if-two-circles-intersect-each-other – Jayy

ответ

14

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

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

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

+0

Да, это была моя проблема. Я попробовал это раньше, но я думаю, что я приказал ошибиться с неправильными сравнениями. Еще раз спасибо. – Battleroid

+1

У вас нет лишнего кода. Так как r1 и r2 оба> 0 (я предполагаю, так как они являются радиусами), то r1 + r2 не нуждается в вызове abs вокруг него. Если вы затем сравните эту проверку с первой, вы заметите, что она всегда будет пытаться, если первая была ложной, поэтому вы можете пропустить условие и сделать последнее простым. – Chris

+0

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

2

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

+0

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

+1

@JonathanDrapeau. Извините, но это неправда. Ну, по крайней мере, так долго * расстояние * означает расстояние между этими двумя центрами. Если центры достаточно велики, чтобы круги пересекались, то мы могли бы иметь два случая: а) центр одной окружности находится внутри другой => d + r2> r1 || d + r1> r2; или b) центр окружности не находится внутри другого круга => d> r1 || d> r2 уже. – Matthias

2

Редактировать для очевидности на комментарий прокси:

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

distance = sqrt(travelled_x_squared + travelled_y_squared); 

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

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

Расстояние находится в контакте на R1 + R2.

Перед редактированием ключей: Вам нужен угол между кругами.

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

atan2 может быть функцией, представляющей интерес.

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

+2

Углы абсолютно неактуальны. Вы всегда можете просто рассмотреть линию через два центра и расстояния вдоль этих линий (расстояние, r1, r2). – Chris

+0

@ Крис Да, это пифагорейское расстояние. –

+0

Я не уверен, что объясняет, почему вы считаете, что вам нужны углы.Вы только собираетесь усложнить ситуацию, и atan2 действительно не интересует эту проблему и собирается привести вас к пути к неправильному решению ... – Chris

9

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

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

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

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

Его проще всего оставить это в категории «еще», а не кодировать его, если вам не по какой-то причине.

0

Его простая задача,

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

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

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

+0

Вы и Даммсквид были правы на деньги. Я пробовал это раньше, но я делал сравнения, поэтому каждый раз он возвращался неправильно. – Battleroid

-1
/** 
    * 
    * @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; 
    } 
    } 
+0

Вы должны использовать кнопку кода, чтобы отформатировать это как исходный код. – Thom

Смежные вопросы