В настоящее время я провожу мозговые штурмы о том, как вычислить расстояние в двумерном массиве всех точек из наборов точек с определенными атрибутами. Хорошим примером (и одним из моих вероятных применений) будет пейзаж с лужами воды на нем. Идея состоит в том, чтобы рассчитать расстояние всех точек в этом ландшафте от воды.
Вот критерии, которые я хотел бы соблюдать, и их обоснование:
1) Скорость исполнения — моя самая большая забота. Ландшафт является динамическим, и код должен выполняться полунепрерывным образом. Под этим я подразумеваю, что существуют периоды обновления местности, которые требуют постоянных обновлений.
2) Память не важна для меня. Это будет выполняться в качестве основного приложения.
3) Должно быть в состоянии динамически обновлять. Смотрите # 1 по причинам этого. Эти обновления могут быть локализованы.
4) Многопоточность возможна. Я уже широко использую многопоточность, так как моя симуляция сильно загружает процессор. Я бы предпочел избегать этого, поскольку это ускорило бы разработку, но я могу сделать это при необходимости.
Я придумала следующий возможный подход и ищу отзывы и / или альтернативные предложения.
1) Выполните итерацию по всему массиву и сделайте позиции коллекции в классе контейнера, соответствующие точкам, рядом с точками с определенным свойством. Назначьте значение 1 для этих точек и 0 для точек со свойством.
2) Используйте позиции, чтобы найти те точки рядом с ними, которые находятся на следующем расстоянии, поместите их во второй класс контейнеров.
3) Повторяйте этот процесс до тех пор, пока ни одна точка не останется без знака
4) Сохраните список точек непосредственно на расстоянии одной единицы для будущих обновлений.
Идея состоит в том, чтобы в основном течь наружу с расстояния 0 и сохранять вычисления, постоянно сужая список точек в цикле.
1) Единственный другой способ сделать это хорошо, о котором я могу подумать, это использовать декартову формулу расстояния, но, по-вашему, у вас будет меньше процессорного времени (поскольку декартово значение должно вычисляться для каждой точки в каждой точке) ,
2) Или, если я правильно понимаю ваше желание, вы можете выполнить итерацию один раз, сохранив все точки с вашим специальным атрибутом в контейнере (указать на них), а затем выполнить итерацию еще раз, используя только формулу расстояния от каждого итерация к каждой из сохраненных точек (затем повторите). Пожалуйста, прокомментируйте и спросите об этом, если это объяснение неясно. Уже поздно, и я очень устала.
Если вы хотите выполнить это сравнение в фоновом режиме, у вас нет выбора, кроме как многопоточность всей программы. Однако, будет ли многопоточность функциональности этого процесса, решать только вам. Если вы воспользуетесь вторым вариантом, который я предоставил, я думаю, что вы сократите нагрузку на процессор, чтобы отказаться от многопоточности рассматриваемого процесса. Чем больше я об этом думаю, тем больше мне нравится второй вариант.