
todo по результатам обсуждения 2009.03.09 -- работа с векторными данными
Reported by Vladislav Zavjalov | March 9th, 2009 @ 10:22 PM
-
Данные: точки, линии, многоугольники.
-
Мы хотим разбить данные на плитки, в каждой из которых лежит не более N объектов, так чтобы плитки легко искались по координатам.
-
Плитки получаются двоичным разбиением перенаселенных плиток или слиянием недонаселенных.
-
Идентификатор плитки в двоичном представлении 0..01 или 10...0, где X и Y -- координаты (0 или 1) внутри каждого разбиения.
-
ссылка из каждого разрезанного объекта на исходный - чтоб быстро искать для редактирования.
-
При изменении объектов определяется затронутый диапазон. Плитки, его накрывающие, пересчитываются. При этом перебираются все объекты, на которые ссылаются плитки минус удаленные объекты плюс добавленные.
-
После пересчета плиток, если число объектов могло уменьшиться или увеличиться происходит попытка слияния или разбиения плиток. Разбиение очевидно. При слиянии берутся 4 брата, если сумма объектов в них больше N (тут возникает гистерезис!), строим set из всех объектов на которые они ссылаются и заново нарезаем.
...
- Резка многоугольников -- как в lib2d/line_rectcrop.h. При резке многоугольников стороны помечаются как "стороны" и "разрезы".
...
- Альтернативная идея -- данные не резать на плитки, а хранить для каждой плитки все, что ее задевает, а при перерисовки собирать объекты в set.
Comments and changes to this ticket
-
Vladislav Zavjalov March 10th, 2009 @ 01:02 PM
- Title changed from todo по ÑезÑлÑÑаÑам обÑÑÐ¶Ð´ÐµÐ½Ð¸Ñ 2009.03.09 -- ÑабоÑа Ñ Ð²ÐµÐºÑоÑнÑми даннÑми to очередные мысли
В первую очередь надо понять, над какой структурой данных делать вьюер.
Интересно сделать вьюер над абстракным классом "графических объектов", которые умеют следующее: * с учетом преобразования отдать свой диапазон * с учетом преобразования обрезаться по границам плитки -- "закэшировать" (не обязательно в растре) данные для рисования на плитке. * нарисоваться на плитку.
Сюда попадают и waypoints с подписями, и треки, и fig... И даже, кажется, растровые картинки!
дополнения: * при изменении объектов надо не забыть возможность уменьшить/увеличить исходный bounding box! (изменить глубину нарезки всех плиток и добавить/убрать внешнюю четверку)
-
плитка должна хранить ссылки на все исходники "ее" объектов (а не кусочки объектов должны хранить ссылки на свои прообразы).
-
процедуры редактирования объектов делает следующее:
- редактирует исходный объект
- вычисляет плитки, куда он попадает
- в этих плитках обновляет ссылки на изменившиеся объекты
- запускает пересчет палитки
- если надо, запускает процедуру слияния или диления плитки
- если надо, запускает процедуру увеличения/уменьшения bbox'а Видимо, все, кроме первого выносится во внешнюю процедру update_range(Rect<> range, int flags), где flags -- флаги, надо ли пытаться делить/сливать плитки, надо ли пытаться уменьшать/увеличивать границы изображения.
-
Vladislav Zavjalov March 10th, 2009 @ 01:02 PM
- Title changed from оÑеÑеднÑе мÑÑли to todo по результатам обсуждения 2009.03.09 -- работа с векторными данными
-
Vladislav Zavjalov March 10th, 2009 @ 01:12 PM
хм, что-то я не осилил нормальную разметку в этих комментариях :) А исправить, кажется, нельзя...
-
Max Ushakov June 3rd, 2009 @ 06:57 PM
Вроде бы приняты следующие обновления этой теории:
Иметь одну плоскость с раз и навсегда установленными координатами, и рисовать всё на ней -- таким образом, нам не надо думать о том, чтобы увеличивать размеры изображения и перестраивать деление на плитки.
Есть разногласия насчёт этой плоскости. Две теории:
* Первая: плоскость совпадает с плоскостью экрана, для неё определены привязка, и масштаб (изменяющиеся согласованно). * Вторая: плоскость есть плоскость естественных координат всех объектов, у неё есть географическая привязка, а она сама отображается на экране в нужном масштабе.Надо написать так и так, и посмотреть, как получается лучше :)
Please Sign in or create a free account to add a new ticket.
With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
develop a mapping software for Linux