Быстрое круговое обнаружение коллизий

Общая идея микросервисов - это слабосвязанные и независимые сервисы. Поскольку 2pc означает, что у нас есть 2 фазы для фиксации транзакции. управляющий узел будет управлять транзакцией, и все остальные узлы сначала отвечают, что они готовы, и на втором этапе все они фиксируют или откатываются в зависимости от первого этапа.

Что произойдет, если управляющий узел не работает? Что происходит, когда любой из других узлов не работает? из-за этого ограничения вся ваша транзакция не может пройти. В распределенных транзакциях ваши узлы могут находиться в разных дата-центрах или регионах. самый медленный узел для ответа будет держать другие узлы в состоянии ожидания, пока они могут двигаться дальше. так атомарность мешает работе.

Вы не можете масштабировать систему, и в целом сервисы должны быть независимыми и масштабируемыми.

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

14
задан Zarkonnen 30 March 2009 в 13:41
поделиться

6 ответов

Хм. Это выглядит довольно хорошим насколько математика идет. Некоторые детали о том, как сделать сторону Java его быстрее и более краткой:

  • Если бы Вы использовали, удваивается вместо плаваний для радиусов, у Вас не было бы к удрученному удваивания до плаваний.
  • Если Вы конкретно просите параметры Point2D.Double, можно использовать их поля общественности X и Y вместо того, чтобы использовать методы считывания.
  • Кроме того, почему if (foo) { return true; } else { return false; }? Просто сделайте return foo;!

Улучшенная версия, затем:

private static boolean isCollision(Point2D.Double p1, double r1, Point2D.Double p2, double r2)
{
    final double a = r1 + r2;
    final double dx = p1.x - p2.x;
    final double dy = p1.y - p2.y;
    return a * a > (dx * dx + dy * dy);
}

(Обратите внимание, что, если Ваш код совершенно основан на плавании, можно сделать то же самое с Point2D.Float и floats.)

21
ответ дан 1 December 2019 в 06:48
поделиться

Наложиться или пересечься?

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

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

9
ответ дан 1 December 2019 в 06:48
поделиться

Необходимо ли действительно обслужить какую-либо возможную реализацию Point2D? Если Вы не будете иметь к, то это сохранит виртуальный вызов:

private static boolean isCollisionFloat (Point2D.Float p1, float r1, Point2D.Float p2, float r2)
{
    final float r = r1+r2;
    final float dx = p1.x - p2.x;
    final float dy = p1.y - p2.y;

    return (r*r) > (dx*dx) + (dy*dy);
}
testing 1000x1000 points:
Doing nothing took 6 ms
Doing isCollision passing Point2D.Float took 128 ms
Doing isCollision passing Point2D.Double took 127 ms
Doing isCollisionFloat took 71 ms
Doing isCollisionDouble took 72 ms

Если Вы можете, выбрать один или другой, а не питание для обоих.


Проблема с вопросами о перфекте состоит в том, что действительно необходимо измерить эффекты, которым временем кто-то отправил тот же ответ как неподдерживаемое мнение.

6
ответ дан 1 December 2019 в 06:48
поделиться

Ваш алгоритм может быть далее оптимизирован путем вычисления прямоугольных границ каждого круга и наблюдения, накладываются ли они. Если они не накладываются, затем просто возвращают false. Это избегает умножения для тех кругов, кто прямоугольные границы, не накладываются (т.е., они не друг близко к другу). Дополнение/вычитание для прямоугольного связанного вычисления является более дешевым, чем умножение.

Это - шаблон тот Java 2D использование. См. Shape.getBounds ()

2
ответ дан 1 December 2019 в 06:48
поделиться

Это не делает Ваш код быстрее, но я предпочел бы:

return a > (dx*dx + dy*dy);
1
ответ дан 1 December 2019 в 06:48
поделиться

Я не знаю, актуально ли это в вашем случае, но если вы хотите проверить совпадения между вашим кругом и многими другими кругами (скажем, тысячами кругов), вы можете попытаться организовать свои круги в виде четырехугольников (см. http://en.wikipedia.org/wiki/Quadtree ) и выполнить поиск дерева (на основе ограничивающего прямоугольника свой круг) в четырехугольнике.

3
ответ дан 1 December 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: