Поиск круга внутри другого круга
У меня проблемы. У меня есть задание, которое требует от меня найти, если второй круг перекрывается, внутри или ни второй круг. Однако у меня возникают проблемы с проверкой перекрытия и если второй круг находится внутри первого.
(используются переменные 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;
}
}