Вот общая идея. Создайте сетку с маленькими ячейками; рассчитать оптимальную линию для каждой не слишком пустой ячейки (вычисление немедленно , поиск не производится). Соедините смежные ячейки, убедившись, что стандартное отклонение улучшается/не ухудшается. Таким образом, мы обнаруживаем четыре стороны и четыре угла и разделяем наши точки на четыре группы, каждая из которых принадлежит к одной из четырех сторон.
Далее мы выбрасываем угловые ячейки, помещаем настоящий прямоугольник вместо четырех приблизительных линий и делаем немного восхождения на холм (или что-то еще).Вычисление наилучшей подгонки может быть увеличено для этого случая, так как две линии параллельны, и мы уже разделили наши точки на четыре группы (для данного прямоугольника мы знаем дельта-y между двумя противоположными сторонами (принимая горизонтальные стороны на мгновение), поэтому мы просто добавляем эту дельта-y к y
с нижней группы точек и делаем расчет).
Исходная прямоугольная сетка может быть заменена рабочей полосой (скажем, вертикальной). Затем по крайней мере половина полос будет иметь две выраженные группировки точек (найти их, разделив каждую полосу горизонтальными линиями деления на ячейки).
Для линии Y = a*X+b
, минимизировать сумму квадратов перпендикулярных расстояний точек {х я, у я} к этой строке. Это прямо разрешимо для a
и b
. Для более вертикальных линий переверните Xs и Ys.
P.S. Я интерпретирую проблему как минимизацию суммы квадратов перпендикулярных расстояний каждой точки до ее ближайшей стороны прямоугольника, а не всех сторон прямоугольника.
Сначала я хотел предложить просто найти минимальные/максимальные координаты ваших точек, но это будет работать только для прямоугольников, параллельных любой оси. Думаю, вам нужен произвольный вращающийся прямоугольник? –
Чтобы подавать эвристику: расположены ли точки, которые «лежат в основном на прямоугольнике или рядом с ним» (т. Е. «Растянутые группы» вдоль линии (линий)) с небольшими расстояниями между ними? И если да, то эти расстояния намного меньше размеров прямоугольника? Также важно: сколько очков больше или меньше на каждую прямоугольную сторону? У вас есть образец изображения? –
@ смысл-вопросы - группировка точек такова, что там, где они плотны, типичное расстояние между соседними точками будет составлять часть длины стороны прямоугольника. Мой текущий алгоритм состоит в том, чтобы искать смежные точки, подходящую им линию, отклонять выбросы, снова подбирать линию и принимать это как одну сторону. Учитывая одну сторону, я затем повторяю поиск параллельных линий, чтобы дать мне временный прямоугольник. Я мог бы сделать изменение координат по методу наименьших квадратов, чтобы точно подогнать прямоугольник, удерживая под прямым углом как фиксированные наблюдения. –