#7 new
Vladislav Zavjalov

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

    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

    Vladislav Zavjalov March 10th, 2009 @ 01:02 PM

    • Title changed from “очередные мысли” to “todo по результатам обсуждения 2009.03.09 -- работа с векторными данными”
  • Vladislav Zavjalov

    Vladislav Zavjalov March 10th, 2009 @ 01:12 PM

    хм, что-то я не осилил нормальную разметку в этих комментариях :) А исправить, кажется, нельзя...

  • Max Ushakov

    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.

New-ticket Create new ticket

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

Shared Ticket Bins

People watching this ticket

Pages