Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
1962 / 818 / 114
Регистрация: 01.10.2012
Сообщений: 4,756
Записей в блоге: 2

Прореживание облака точек

10.12.2016, 09:52. Показов 5257. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте

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

Есть облако из N точек в пр-ве. Нужно выкинуть из него некоторое кол-во точек чтобы сделать плотность более равномерной. Пользователь хочет сделать это 2 разными способами (2 подзадачи)

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

- выкинуть заданное кол-во точек чтобы получить облако из M точек (M < N).

Интересует в первую очередь "дешевизна" решения, это всего лишь 2 малюсенькие опции. Разумеется "каждый с каждым" не проходит уже на 10K точек, а их может быть и намного больше

С уважением
Игорь
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.12.2016, 09:52
Ответы с готовыми решениями:

Посчитать площадь вокруг облака точек (с учётом области влияния точек)
Есть набор точек на плоскости. Каждая точка имеет известную область влияния, допустим в радиусе 1000 м. Для простоты область влияния...

Центр "облака" точек
Есть массив точек с координатами Х, У. Необходимо найти координаты наиболее &quot;кучной&quot; группы точек. Буду рад любым идеям. Надеюсь на...

Отображение облака точек в 3D
Здравствуйте, есть облако точек , как мне отобразить это облако точек в 3д чтобы эти 3д точки нарисовались, не нужно их соединять...

19
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
10.12.2016, 11:21
Поступите проще. Разбейте вашу область на квадраты с
таким рассчётом, чтобы в квадрате была одна точка.
Лишнее выбросьте. А если попадется квадрат без точки, то
добавьте точку в его центр
0
1962 / 818 / 114
Регистрация: 01.10.2012
Сообщений: 4,756
Записей в блоге: 2
10.12.2016, 17:18  [ТС]
Цитата Сообщение от echs Посмотреть сообщение
Поступите проще. Разбейте вашу область на квадраты с
таким рассчётом, чтобы в квадрате была одна точка.
Лишнее выбросьте. А если попадется квадрат без точки, то
добавьте точку в его центр
Это можно понимать всяко-разно. К тому же в пр-ве это не квадрат а куб. Вероятно Вы имели ввиду использовать ассоциативный контейнер, напр так

- из координат данной точки получить "ключ" (напр поделить x, y, z на сторону и округлить)
- если по этому ключу уже есть точка, то данную выкидываем, иначе оставляем

Если не так - поправьте. А если так - то это еще не решение. Во-первых могут быть "близкие соседи но в разных кубах". Во-вторых, где взять сторону куба для второй вариации?
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
10.12.2016, 19:58
Igor3D
Вы меня в целом правильно поняли. Хорошо пусть
будет областью куб (это не принципиально). Суть
разбиения состоит в том, что "куб" - это как бы "большая"
точка. То есть мы переходим от очень большого количества
точек к меньшему количеству. Вот вы говорите, что может
получится где-то не очень равномерно. Да. Вы правы. Вы
тысячу раз правы!! Но ни один алгоритм не даст вам такой
гарантии. Погрешность в плотности была, есть и будет...
...
Есть и другой вариант, при котором в принципе не будет рядом
стоящих точек. Итак предполагается, что все пространство разбито
на кубики. Диаметр кубиков должен быть равен заданному вами
расстоянию minD. В этом случае вы берете первый (по счету) кубик
и оставляете в нем одну точку, во всех остальных кубиках, соприкасаемых
с данным (их 26 штук) точки полностью выбрасываются.
...
Если у вас задан трёхмерный массив, то все операции удобно
провести в трёхкратном цикле с шагом равным 2.
Вы понимаете, кубик с точкой будет отделен от другого кубика с точкой
пустым кубиком. И условие плотности будет соблюдено.
0
1962 / 818 / 114
Регистрация: 01.10.2012
Сообщений: 4,756
Записей в блоге: 2
11.12.2016, 13:14  [ТС]
Цитата Сообщение от echs Посмотреть сообщение
Хорошо пусть будет областью куб (это не принципиально).
"Размер(ность) имеет значение", дальше речь пойдет в основном о ней

Цитата Сообщение от echs Посмотреть сообщение
Есть и другой вариант, при котором в принципе не будет рядом
стоящих точек. Итак предполагается, что все пространство разбито
на кубики. Диаметр кубиков должен быть равен заданному вами
расстоянию minD. В этом случае вы берете первый (по счету) кубик
и оставляете в нем одну точку, во всех остальных кубиках, соприкасаемых
с данным (их 26 штук) точки полностью выбрасываются.
Проще проверять соседние кубы и выкидывать точки расстояние до которых (от точки данного куба) < minD. Но даже это совсем не "дешево" для реализации.

Цитата Сообщение от echs Посмотреть сообщение
Если у вас задан трёхмерный массив,
Применимость таких структур (lattice) весьма ограничена в 3D вследствие потенциально большого объема хранимых данных. Напр все точки как точки а один урод отлетел на километр - получите "sparse". Поэтому хранят обычно лишь "живые" кубы (в которых есть точки), но тогда придется делать двоичный поиск для каждого из 26 соседей. В общем забот там предостаточно, начинать эту длинную песню мне совсем не хочется.

Да, и по-прежнему ничего не видно для второго варианта (удалить заданное число точек)
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
11.12.2016, 14:57
Igor3D
Есть другой вариант, который тоже основан на принципе
"разделяй и властвуй". Надо трёхмерное пространство
разрезать на слои как пирог. Расстояние между слоями
должно быть по определению minD. Надеюсь вы уже
догадались, что слои должны чередоваться. Слой, который
содержит точки лежит на слое, в котором нет точек (а если
они есть, то все точки выкидываются).
Затем каждый слой (некоторое подобие плоскости имеющей
толщину) делится параллельными линиями на части. Расстояние
между линиями равно minD. Здесь тоже полоски делятся на
те, что содержат точки и те, в которых их быть не должно.
(если точки есть, то выбрасываются). Эти полосы чередуются...
...
Вам в принципе может хватить одного линейного массива
если, конечно все данные хранятся в файле (а где же еще
если их к примеру миллион)
0
2619 / 1630 / 266
Регистрация: 19.02.2010
Сообщений: 4,325
11.12.2016, 21:58
Цитата Сообщение от Igor3D Посмотреть сообщение
расстояние между любыми двумя точками не должно быть меньше заданного minD, сколько точек выкинуть без ограничений
Если нужно/хочется при этом убирать шум и выбросы - то нейросетка типа SOINN/ESOINN.

Если нужно просто уменьшить число точек - то метод серединного сечения многомерного пространства, до тех пор, пока у какого-нибудь параллелепипеда сторона не станет меньше некоторого порога (проще контролировать размер стороны, чем вычислять расстояние между центрами соседних паралеллепипедов для последующего сравнения с minD). После этого все точки, попавшие в каждый параллелепипед, выбрасываются, кроме ближайшей к центру.
При необходимости - можно ускорить последний этап, не вычисляя все расстояния между точками в гиперпараллелепипеде и его центром, а заменяя все эти точки на центр параллелепипеда (думаю, для практики будет допустима такая "погрешность").
А самО серединное сечение должно работать быстро - см на длительность оптимизации цветовой палитры этим алгоритмом для многомегапиксельных фоток (при операции сокращения числа цветов в палитре).
0
1962 / 818 / 114
Регистрация: 01.10.2012
Сообщений: 4,756
Записей в блоге: 2
12.12.2016, 10:02  [ТС]
Цитата Сообщение от echs Посмотреть сообщение
(а если
они есть, то все точки выкидываются).
"Дешевое" решение совсем не значит что можно делать "все что хочу". Напр захотели выкинуть точки - и выкинули. Так нельзя, напр если все исходные точки достаточно далеко друг от друга (подзадача 1), то ничего и не выкидывается

Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Если нужно/хочется при этом убирать шум и выбросы
Не нужно

Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
то метод серединного сечения многомерного пространства,
А что это за метод? (гугл дает только что-то о лесозаготовках)

Ну и попробую еще раз: может как-то планировать чтобы код/решение были общими для обеих подзадач?
0
2619 / 1630 / 266
Регистрация: 19.02.2010
Сообщений: 4,325
12.12.2016, 22:33
Цитата Сообщение от Igor3D Посмотреть сообщение
А что это за метод?
https://en.wikipedia.org/wiki/Median_cut
На русском по методу медианного сечения тоже нагугливается немного.

Просто 20 лет назад, в русском PC Magazine 7/95, переводилось именно как серединное сечение. А импринтинг - вещь заразная
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
13.12.2016, 16:35
Все данные точки записать в массив известной длинны. Опция разрежение это количество запросов к рендом генератору. Например задаем разрежение 1000.

От случайного генератора 1000 раз спрашиваем индекс в массиве точек которую удаляем.
0
1962 / 818 / 114
Регистрация: 01.10.2012
Сообщений: 4,756
Записей в блоге: 2
14.12.2016, 11:16  [ТС]
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
https://en.wikipedia.org/wiki/Median_cut
На русском по методу медианного сечения тоже нагугливается немного.
Спасибо, понял. Но не вижу как это связано с прореживанием. Ну разбили по bucket'ам - проблемы те же что с разбивкой по кубам, ближайшие также могут находиться и не в одном bucket. Может как-то приспособить для подзадачи 2 - но выходит коряво, надо как-то дотягиваться до степени двойки, да и "которые выкидывать" - ничего на руках нет.

Цитата Сообщение от Excalibur921 Посмотреть сообщение
Все данные точки записать в массив известной длинны. Опция разрежение это количество запросов к рендом генератору. Например задаем разрежение 1000.
От случайного генератора 1000 раз спрашиваем индекс в массиве точек которую удаляем.
Ничего не понял На всякий случай уточню/подчеркну - можно только выкидывать, никаких новых точек создавать нельзя
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
14.12.2016, 11:53
Переводим случайное число в номер индекса в массиве известной длинны и удаляем эту точку.
0
Модератор
Эксперт функциональных языков программирования
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
14.12.2016, 12:18
Цитата Сообщение от Igor3D Посмотреть сообщение
расстояние между любыми двумя точками не должно быть меньше заданного minD, сколько точек выкинуть без ограничений
Задача сформулирована некорректно (неполно).
Можно, например, выбрать произвольную точку и выкинуть все остальные. Все требования соблюдены, но вряд ли это то, что нужно Пользователю.

Точно так же, если мы возьмём, например, простейший алгоритм (выбираем точку, ищем и удаляем соседей в заданном диапазоне, выбираем следующую точку), то результат будет зависеть от того, в каком порядке мы выбираем точки. Устроит ли это Пользователя?
0
1962 / 818 / 114
Регистрация: 01.10.2012
Сообщений: 4,756
Записей в блоге: 2
14.12.2016, 13:29  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Задача сформулирована некорректно (неполно).
Такого рода придирки ничем не кончаются, время (и место на форуме) бестолково тратится на "формализацию", а когда в конце-концов эта схоластика надоедает - наступает тишина, тема убита. Ну и зачем? Предложите лучшую формулировку, никто же не возражает.

Цитата Сообщение от Shamil1 Посмотреть сообщение
Точно так же, если мы возьмём, например, простейший алгоритм (выбираем точку, ищем и удаляем соседей в заданном диапазоне, выбираем следующую точку), то результат будет зависеть от того, в каком порядке мы выбираем точки. Устроит ли это Пользователя?
Не надо понимать так буквально. Я написал "пользователь хочет" для простоты, но я никого ни о чем не спрашивал - просто сам вижу что в данном редакторе такие опции были бы полезны и к месту. Вопрос в "цене реализации". Если не найдется удобного решения - может и вообще ничего делать не буду. Есть такое понятие "инициатива" (с которым у Вас напряженка )
0
Модератор
Эксперт функциональных языков программирования
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
14.12.2016, 14:05
Igor3D,
А по существу?
Цитата Сообщение от Shamil1 Посмотреть сообщение
Устроит ли это Пользователя?
0
1962 / 818 / 114
Регистрация: 01.10.2012
Сообщений: 4,756
Записей в блоге: 2
14.12.2016, 14:41  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
А по существу?
Прибегаете к дешевым приемам

Цитата Сообщение от Shamil1 Посмотреть сообщение
Цитата Сообщение от Shamil1 Посмотреть сообщение
Устроит ли это Пользователя?
А чего Вы это спрашиваете у меня/юзера? Сами решайте, Вы же программист (алгоритмист)
0
Модератор
Эксперт функциональных языков программирования
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
14.12.2016, 15:56
Цитата Сообщение от Igor3D Посмотреть сообщение
Прибегаете к дешевым приемам
Вы ищете подвох там, где его нет. Я предложил алгоритм, но отметил недостатки, присущие результату.

Цитата Сообщение от Igor3D Посмотреть сообщение
Сами решайте, Вы же программист (алгоритмист)
Каким образом я могу решать, какой результат Вам нужен?

Что касается "инициативы", то есть две разные работы: постановка задачи и решение задачи. Для выполнения первой мне бы понадобился ответ на вопрос "Для чего пишется эта программа". Краткий ответ на этот вопрос занял бы приблизительно 10 страниц А4. Более компактный ответ, скорее всего, лишь породил бы дополнительные вопросы. Поэтому мне тупо лень этим заниматься (тем более, что телепаты в отпуске).
0
1962 / 818 / 114
Регистрация: 01.10.2012
Сообщений: 4,756
Записей в блоге: 2
14.12.2016, 16:30  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
есть две разные работы: постановка задачи и решение задачи. Для выполнения первой мне бы понадобился ответ на вопрос "Для чего пишется эта программа". Краткий ответ на этот вопрос занял бы приблизительно 10 страниц А4. Более компактный ответ, скорее всего, лишь породил бы дополнительные вопросы. Поэтому мне тупо лень этим заниматься (тем более, что телепаты в отпуске).
Так я Вам этого и не предлагал. По-моему термин "прореживание" достаточно интуитивен, хотя бы по аналогии с сельским хозяйством. А тут товарищ предлагает "вот тут вообще всю полосу вырезать". А Вы пошли еще дальше "а я вот выкошу все и оставлю один росток". Смех и грех. Почему труженики полей без всяких объяснений прекрасно понимают что значит "проредить" , а Вы нет?
0
Модератор
Эксперт функциональных языков программирования
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
14.12.2016, 20:09
Похоже, что Вы не прочитали алгоритм, который я предложил.
0
1962 / 818 / 114
Регистрация: 01.10.2012
Сообщений: 4,756
Записей в блоге: 2
15.12.2016, 12:19  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Похоже, что Вы не прочитали алгоритм, который я предложил.
Это я о нем тактично умолчал, т.к. знаю что Вы способны на гораздо большее.

Мои соображения. Думаю что неизбежен какой-то "базовый поиск" который надо повторить для всех N точек. Всякий раз базовый поиск выдает какое-то число "пар" (точка-точка) которые надо сохранить, и на основании всех этих пар уже решать кого удалять. И тут начинаются неясности. В первой подзадаче нужно сохранять все пары с расстоянием < minD, число сохраненных может оказаться слишком велико. Во второй наоборот мало если ограничить число пар числом удаляемых - ведь одна точка может входить в неск пар. Решать это за 2 и более прохода не хотелось бы.

С остальным вроде бы нормуль. Базовый поиск - ну у меня kd-tree всегда под рукой (кстати его называют и "медианным деревом"). Выбор удаляемой - ну просто та что входит в наибольшее число пар.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2016, 12:19
Помогаю со студенческими работами здесь

Фигура из облака точек
У меня есть чертеж AutoCAD (файл dwg), в котором представлено облако точек. Мне нужно нарисовать фигуру. Фигура похожа на цилиндр, однако...

Объединение облака точек
День добрый. Есть двумерный массив (способ задания разницы не имеет - всегда можно переделать на нужный). В нем все точки заполнены...

Построение Евклидова облака точек
Добрый день! Третий день ломаю голову над большой задачей. Пока не буду ее тут всю выкладывать, хочу допереть сам. Сейчас главная...

Импорт и отображение облака точек
Здравствуйте! Очень нужна помощь.. Есть .ptx файл (результат лазерного сканирования) с облаком точек (x, y, z, intensity). Я сохранила...

Как из облака точек распознавать объекты?
как из облака точек распознавать объекты?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru