Как получить размер пересекающейся части по кругу в Java - PullRequest
6 голосов
/ 10 января 2012

Мне нужен размер черной части этого изображения:image

Я провел некоторое исследование о том, как найти его в обычной математике, и мне указали на этот сайт: Веб-сайт

Окончательный ответ при полученииэто было pict http://mathworld.wolfram.com/images/equations/Circle-CircleIntersection/Inline41.gif

, где r - радиус первого круга, R - радиус второго круга, и d - расстояние между двумя центрами.

Код, который я пыталсяиспользовать, чтобы получить размер этого был следующим:

float r = getRadius1();
float R = e.getRadius1();
float deltaX = Math.abs((getX()  + getRadius()) - (e.getX() + e.getRadius()));
float deltaY =  Math.abs((getY()  + getRadius()) - (e.getY() + e.getRadius()));
float d = (float) Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));

float part, part2, part3;
//Chopping it in parts, because it's easier.

part = (float) (Math.pow(r,2) * Math.acos(
      Math.toRadians((Math.pow(d, 2) + Math.pow(r, 2) - Math.pow(R, 2))/(2*d*r))));

part2 = (float) (Math.pow(R,2) * Math.acos(
      Math.toRadians((Math.pow(d, 2) + Math.pow(R, 2) - Math.pow(r, 2))/(2*d*R))));

part3 = (float) (0.5 * Math.sqrt((-d + r + R) * (d+r-R) * (d-r+R) * (d+r+R)));

float res = part + part2 - part3; 

Main.log(res + "       " + part + " " + part2 + " " + part3+ "       "
         + r + " " + R  + " " + d);
//logs the data and System.out's it

Я провел некоторое тестирование, и был получен следующий вывод:

1345.9663       621.6233 971.1231 246.78008       20.0 25.0 43.528286

Таким образом, это означает, что размер перекрывающейся части был больше, чем сам круг (который равен r^2 * PI).

Что я сделал не так?

1 Ответ

5 голосов
/ 10 января 2012

Просто предположение (как указано в моем комментарии): попробуйте удалить преобразование Math.toRadians(...).

Поскольку в формуле нет степеней, а радиусы, я предполагаю, что параметр равен cos -1 (...) - это уже значение в радианах.

Если удалить преобразование и запустить ваш код, я получу следующий размер области перекрытия: 11.163887023925781что кажется правдоподобным, поскольку длина сегмента перекрытия на линии между двумя центрами составляет 20 + 25 - 43.5 = 1.5 (приблизительно)

Редактировать :

Если установить расстояние до5 (меньший круг полностью содержится в большем, но касается его края) Я получаю размер области перекрытия 1256.63, который в точности соответствует площади меньшего круга (20 2 * Π).Расчет не работает, если расстояние меньше, чем разница радиусов (т.е. в вашем случае меньше 5), но это может быть просто проблемой числового представления (обычные типы данных могут быть не в состоянии представить некоторыепромежуточных результатов).

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