Russian Qt Forum
Ноябрь 23, 2024, 00:24
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Алгоритмы
>
Найти треугольник [решено]
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Найти треугольник [решено] (Прочитано 15494 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Найти треугольник
«
Ответ #15 :
Январь 30, 2012, 19:03 »
Цитата: Черный Странник от Январь 30, 2012, 16:51
Двумерный массив списков. Каждый список - номера треугольников (из nvtr), которые попадают в соответствующий прямоугольник. У меня сетка достаточно равномерная, так что в адаптивной прямоугольной сетке нужды не было. Если нужна адаптивная - например список списков. Первые k*p элементов символизируют первичную прямоугольную сетку. Если в этих элементах содержатся положительные числа - то это индексы из nvtr, если отрицательные - то это четыре элемента списка (с индексом больше чем k*p) являющиеся четырьмя прямоугольниками, на которые разбит первичный четырехугольник ну и дальше по рекурсии.
Я сам заядлый велосипедист, но здесь - не стоит, octree сильнее (и его не нужно будет бесконечно латать). У меня расчет начинается с облака точек, по ним я строю треугольники, поэтому дерево для поиска вертексов у меня по-любому есть. Строить еще одно дерево - жаба давит. Неужели нельзя обойтись одним? Давайте-ка подумаем, а то как что нешаблонное - так сразу уж и "неудобная структура данных"
(
Следующий параграф слабонервным лучше не читать
)
Объем данных не фиксирован. Т.е. если получен отказ на malloc - надо парить по частям. Так что сажать (кучерявые) деревья почем зря в мои планы не входит
Записан
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2901
Re: Найти треугольник
«
Ответ #16 :
Январь 30, 2012, 21:48 »
Цитата: Igors от Январь 30, 2012, 19:03
Т.е. если получен отказ на malloc
Под какую ось пишешь?
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
alexman
Гость
Re: Найти треугольник
«
Ответ #17 :
Январь 30, 2012, 22:45 »
OcTree используется только для поиска вершин? Или еще для чего то? (Просто интересно)
Записан
Blackwanderer
Гость
Re: Найти треугольник
«
Ответ #18 :
Январь 31, 2012, 05:08 »
Цитата: Igors от Январь 30, 2012, 19:03
У меня расчет начинается с облака точек, по ним я строю треугольники, поэтому дерево для поиска вертексов у меня по-любому есть.
А зачем вам дерево для поиска вертексов? У вас логическая единица задачи - треугольник.
Проблемы вашей структуры данных следующие:
1) Сборка треугольника из вертексов - это дополнительная подзадача, к тому же с кучей if-ов.
2) Понятие ближайшей точки субъективно. Что такое ближайшая точка?
Какие у вашей структуры данных преимущества?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Найти треугольник
«
Ответ #19 :
Январь 31, 2012, 09:08 »
Цитата: pastor от Январь 30, 2012, 21:48
Под какую ось пишешь?
OSX + (злополучное) Вындоуз
Цитата: alexman от Январь 30, 2012, 22:45
OcTree используется только для поиска вершин? Или еще для чего то? (Просто интересно)
Цитата: Черный Странник от Январь 31, 2012, 05:08
А зачем вам дерево для поиска вертексов? У вас логическая единица задачи - треугольник.
Наоборот, треугольники в данном случае играют вспомогательную роль. Упрощенно: сначала создается облако вертексов, у каждого есть "зона захвата/влияния" которая многократно корректируется в процессе расчета. Если один вертекс влияет на другой - образуется ребро. Какие-то вертексы могут не иметь ребер, в каких-то (пусть редких) случаях треугольников может вообще не быть.
Записан
alexman
Гость
Re: Найти треугольник
«
Ответ #20 :
Январь 31, 2012, 13:36 »
Igors, есть какое-то решение? Или хотите посмотреть варианты?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Найти треугольник
«
Ответ #21 :
Январь 31, 2012, 14:13 »
Цитата: alexman от Январь 31, 2012, 13:36
Igors, есть какое-то решение? Или хотите посмотреть варианты?
Нащупал кое-что, вроде должно получиться. Но по ходу дела совсем запутался в построении треугольников
За пару дней разложу все по полочкам, тогда отпишусь
Задумка простая: сначала (предрасчет) для каждого вертекса рассортировать все выходящие из него ребра "по углу". Тогда треугольники будут (почти) готовы
Записан
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2901
Re: Найти треугольник
«
Ответ #22 :
Январь 31, 2012, 16:31 »
Цитата: Igors от Январь 31, 2012, 09:08
OSX + (злополучное) Вындоуз
Чисто к сведению: на юникс-лайк системах malloc/new не всегда возвращает NULL (или генерит bad_alloc в случае new), а возвращает "корректный" адрес на участок памяти. При первом обращении к такому участку памяти получаем краш. Так что проверки на NULL, ловля bad_alloc, установка new handler бесполезны. Все это связано с
memory overcommit.
. Думаю будет полезно ознакомиться.
Сорри за оффтоп.
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Найти треугольник
«
Ответ #23 :
Январь 31, 2012, 16:57 »
Цитата: pastor от Январь 31, 2012, 16:31
Чисто к сведению: на юникс-лайк системах malloc/new не всегда возвращает NULL (или генерит bad_alloc в случае new), а возвращает "корректный" адрес на участок памяти. При первом обращении к такому участку памяти получаем краш. Так что проверки на NULL, ловля bad_alloc, установка new handler бесполезны. Все это связано с
memory overcommit.
. Думаю будет полезно ознакомиться.
Это я для простоты так сказал "отказ malloc". На самом деле в этом проекте все выделения памяти перекрыты и NULL возвращается если общее кол-во выделенной памяти превысило предел заданный пользователем. Дальше начинается (довольно мучительное) выяснение какие данные снести на диск (чтобы затем опять подгрузить). Это я к тому что с деревьями особо не разогнаться.
Пастор, Вы стали много читать
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Найти треугольник
«
Ответ #24 :
Февраль 03, 2012, 10:17 »
В общем сделал, все оказалось легко. Для каждого вертекса сортирую исходящие из него ребра по углу. На поиске просто перебираю ребра, каждое образует треугольник с предыдущим. Плюс 2 дополнительные проверки
- проверка угла между ребрами на < 180
- проверка "треугольник уже был рассмотрен". Реализовал незатейливым массивом и линейным просмотром
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...