Каково максимальное и минимальное расстояние между двумя точками на разных кругах? - PullRequest
0 голосов
/ 15 октября 2018

Предположим, у меня есть два круга с (x 1 , y 1 , r 1 ) и (x 2 , y 2 , r 2 ) как их координаты и радиус соответственно.При этом каково максимальное и минимальное расстояние между ними.Что я делал до сих пор:

double centreDistance = Math.sqrt(Math.pow((x[i] - x[j]), 2) + Math.pow((x[i] - y[j]), 2));
if (centreDistance >= r[i] + r[j]) {
    double maxDistance = centreDistance + (r[i] + r[j]);
    double minDistance = centreDistance - (r[i] + r[j]);
} else if (centreDistance == 0) {
    double minDistance = Math.abs(r[i] - r[j]);
    double maxDistance = Math.abs(r[i] - r[j]);
} else {
    int rmax = Math.max(r[i], r[j]);
    int rmin = Math.min(r[i], r[j]);
    double minDistance = rmax - (centreDistance + rmin);
    double maxDistance = rmax + (centreDistance - rmin);
}

Здесь x, y, r - массивы, имеющие x, y координаты центра каждого круга и радиуса соответственно. Это дает мне неправильный ответ.

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Проблема rmax и rmin являются целыми числами.Когда вы возвращаете результат max и min, он округляется до значения int.

0 голосов
/ 15 октября 2018

Другой путь неверен.

Это:

double maxDistance = rmax + (centreDistance-rmin);

должно быть:

double maxDistance = rmax + centreDistance + rmin;

Вы также пропускаете случай пересечения окружностей.Это тот случай, когда

centreDistance < r1+r2 && centredistance + rmin >= rmax

В этом случае

minDistance = 0 
maxDistance = rmax + centreDistance + rmin

centreDistance == 0 также неверно, это должно быть maxDistance = r1 + r2 (поскольку вы должны сравнивать точки на противоположныхсторона центра. В любом случае, это просто особый случай пути else и может быть опущен.

Реальный случай:

centreDistance>=r[i]+r[j]       (centres are so far apart the circles don't overlap, or touch in one point)
centreDistance < r1+r2 && centredistance + rmin >= rmax        (circles intersect)
centreDistance < r1+r2 && centredistance + rmin < rmax        (one circle inside the other)
0 голосов
/ 15 октября 2018

в случае касания круга, вам нужно внести некоторые корректировки

if (centreDistance >= r[i] + r[j]) {
        // the circle dont touch, min and max distance are the closest and most far apart parts of the circles
        // code is correct
        double maxDistance = centreDistance + (r[i] + r[j]);
        double minDistance = centreDistance - (r[i] + r[j]);
    } else if (centreDistance == 0) {
        // the circle are on top of each other
        // check if they have the same radius -> max min dist = 0
        // if not max and min distance = Math.abs(r[i] - r[j]);
        // code is correct
        double minDistance = Math.abs(r[i] - r[j]);
        double maxDistance = Math.abs(r[i] - r[j]);
    } else {
        // the circles touch 
        // max distance is the same as in case where they dont touch
        // and min distance is 0 because they touch
        // code has to be adjusted
        int rmax = Math.max(r[i], r[j]);
        int rmin = Math.min(r[i], r[j]);
        double minDistance = rmax - (centreDistance + rmin);
        double maxDistance = rmax + (centreDistance - rmin);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...