Расчеты перекрывающихся или пересекающихся кругов

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

Я считаю, что формула для этого: (r1+r2)^2 ‹= (x2-x1)^2+(y2-y1)^2

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

    //variables
    //crOneRadius = radius of circle 1
    //crTwoRadius = radius of circle 2
    //crOneCenterX = x axis location of circle 1
    //crOneCenterX = y axis location of circle 1
    //crTwoCenterX = x axis location of circle 2
    //crTwoCenterX = y axis location of circle 2     
    //BOoverlap = is boolean if it is ovelapping circles set to true
    if((crOneRadius+crTwoRadius)*(crOneRadius+crTwoRadius)<=((crTwoCenterX-crOneCenterX)*(crTwoCenterX-crOneCenterX))+((crTwoCenterY-crOneCenterY)*(crTwoCenterY-crOneCenterY)))
        BOoverlap=true;//overlap is true

person ike    schedule 29.11.2015    source источник
comment
Откуда ты знаешь, что он не работает? Я предполагаю (хотя в вашем вопросе этого нет в вашем коде), что вы инициализируете BOverlap (кстати, вы не должны использовать первую букву переменной в Java) значением false. Наблюдали ли вы случаи, когда это правда и должно быть ложно, или когда это ложно и должно быть правдой?   -  person aro_tech    schedule 29.11.2015
comment
Да, я наблюдал это. Каждый раз выходит ложь, я использую java fx для отображения двух кругов, и это никогда не бывает правдой.   -  person ike    schedule 29.11.2015
comment
Вы зарегистрировали/распечатали значения 6 переменных и результат BOverlap? Я предлагаю вам выделить этот расчет в отдельный метод и протестировать его с другими значениями (вы можете написать тест в методе main(), если не хотите использовать JUnit или TestNG).   -  person aro_tech    schedule 30.11.2015
comment
Кстати, чтобы лучше видеть, что происходит в коде, я бы также вычислил некоторые промежуточные значения, поэтому расчет больше похож на sumOfRadii*sumOfRadii <= deltaX*deltaX + deltaY*deltaY. Чтобы еще больше улучшить читаемость, вы можете даже написать свой собственный метод square() или использовать Math.pow(x,2), давая что-то вроде square(sumOfRadii) <= square(deltaX) + square(deltaY).   -  person aro_tech    schedule 30.11.2015


Ответы (1)


Расстояние d между двумя центрами C1 и C2 должно быть меньше суммы их радиусов r1 + r2, чтобы окружности пересекались:

введите здесь описание изображения

|C1 - C2| <= r1 + r2

Квадрат обеих сторон

(x1 - x2)ˆ2 + (y1 - y2)^2 <= (r1 + r2)^2

or

(r1 + r2)^2 >= (x1 - x2)^2 + (y1 - y2)^2,

что является условием, противоположным тому, которое вы используете.

person Leandro Caniglia    schedule 05.12.2015