Просмотр задачи

НомерПроектКатегорияВидимостьИзменен
0002048SAS.ПланетаХотелка / Feature requestпубличная31-08-2015 09:20
Инициаторvasketsov Ответственныйvdemidov  
ПриоритетобычныйВлияниебольшоеВоспроизводимостьнеприменимо
Состояние решенаРешениерешена 
ПлатформаWindowsОперационная системаVistaВерсия ОСUltimate
Версия продукта121010 
Целевая версия150915Решена в версии150915 
Тема0002048: Дырки в полигонах
ОписаниеНеобходимо в базовых геопримитивах (полигон и т.п.) реализовать поддержку дырок. Также поддержку дырок необходимо реализовать и далее по цепочке использования полигонов, в том числе а) отображение и б) подсказки при наведении.

Под дыркой понимается участок внутренней границы полигона. Сам полигон задаётся совокупностью внешних границ (возможно, пересекающихся). Одна дырка принадлежит всегда к одной и только к одной внешней границе. Внутри участка полигона, образованного внешней границей, может быть произвольное количество дырок.

Дополнительные формальные условия - непересекаемость дырок одного полигона и невыход дырок за границу своей внешней области - при хранении в памяти и (де)сериализации несущественны, но при редактировании, рисовании, реализации итераторов,... надо будет сделать некое разумное минимально функциональное решение, например, не сохранять и не рисовать дырку, если она нарушает эти условия.
Дополнительные сведенияПри создании полигона с дырками можно обойтись той же техникой, что и сейчас для разделения участков внешних границ, если использовать другой разделитель. Одну из координат разделителя можно оставить как есть, другую наделить смысловой частью.
МеткиVIP, полигоны

Связи

связана с 0002765 решенаzed Access Violation при экспорте SML меток 
блокирует 0001471 решенаvdemidov Сделать импорт KML с дырками 
блокирует 0001877 решенаzed Логические функции при работе с полигонами 

Деятельность

vdemidov

26-07-2013 08:25

руководитель   ~0012208

Хорошая идея с использованием второй координаты разделителя при сериализации.

zed

25-04-2015 11:58

руководитель   ~0015742

Сейчас, как я понимаю, разделителем мульти-геометрий выступает значение NaN и вместо того, чтобы записывать его и в X и в Y, в Y предлагается записать какой-то признак того, что это дырка?

vasketsov

25-04-2015 15:38

руководитель   ~0015747

Ну, мысль была именно такая.
Но на всякий случай надо как-то проверить, не формируются ли в коде точки, где одна из координат NaN. А также не могут ли они прилететь снаружи, или быть введены пользователем. Чтобы дырки плодились только в генераторе дырок.

zed

25-04-2015 15:41

руководитель   ~0015748

Там ещё есть 4 резервных байта, можно юзать их. Писать туда magic какой-нить.

  TGeometryPointSML = packed record
    X: Extended;
    Y: Extended;
    Reserved: LongWord; // proper record aligment for backward compatibility
  end;

vasketsov

25-04-2015 15:58

руководитель   ~0015749

>можно юзать их
Слишком опасно, этот кусок в нормальном числе может быть не проинициализирован, или снаружи прилететь может, на форуме вон руками многие читают и пишут массив lonlat.

zed

05-05-2015 17:12

руководитель   ~0015858

vdemidov
Как планируешь изменять интерфейсы полигонов?

vdemidov

05-05-2015 17:32

руководитель   ~0015859

Скорее всего сделаю иерархию примерно как в kml, тоесть будет LineRing содержащий примитивный одиночный полигон. А SinglePolygon будет содержать внешний контур и несколько внутренних с типом LineRing.

vdemidov

09-08-2015 09:32

руководитель   ~0016358

Итого уже есть поддержка дырок в базе меток на SQLite, в мержилке полигонов и экспорте в KML. В базу SML и всякие HLG, SLS сохраняться должно правильно, но пока считывается неправильно. Да и вообще все нужно тщательно проверять.

zed

09-08-2015 14:02

руководитель   ~0016359

>в мержилке полигонов
*частично - создавать умеет, а читать ещё нет (см. TMergePolygonsProcessor.SinglePolygonToClipperPaths)

И самое главное, что полигон с дыркой у меня вообще никак не отображается, хотя информацию о метке показывает вроде правдоподобную.

vdemidov

09-08-2015 14:09

руководитель   ~0016360

Странно. У меня из SQLite базы вроде бы отображалось. Но там еще в построителе полигонов глюки были.

vdemidov

09-08-2015 14:11

руководитель   ~0016361

> *частично - создавать умеет, а читать ещё нет
Ну это тебе виднее. Добавь, если не сложно, поддержку.

vdemidov

09-08-2015 14:14

руководитель   ~0016362

Еще, редактирование полигонов с дырками превращает их в мультиполигоны.

zed

09-08-2015 14:32

руководитель   ~0016363

>Добавь, если не сложно, поддержку.
Добавлю конечно. Просто, пока не работает отображение, сложно что-либо тестировать. А добавлять что-то без тестирования, как-то стрёмно.

Я для теста создал 2 квадрата, большой и маленький, один над другим. И применил к ним XOR операцию (из большого вырезал маленький). Результат операции окрасился верно, с дыркой, полигон сохранился в БД SQLite, но на экране не отображается. Экспорт в kml отработал нормально и GE дырку нарисовал.

zed

09-08-2015 14:46

руководитель   ~0016364

При дабл-клике по полигону из Управления метками, карта уносится в какую-то неведомую даль. Что-то явно не так с координатами и поэтому оно его и нарисовать скорее всего не может. Хотя в kml все координаты верные и при импорте из него получается мультиполигон именно там, где он и должен быть.

zed

09-08-2015 14:57

руководитель   ~0016365

Упс. Не заметил пару твоих последних коммитов. Сейчас в даль не уносится и полигон с дыркой отображает.

vdemidov

23-08-2015 13:30

руководитель   ~0016401

Вроде бы поддержка дырок есть везде, где я собирался ее добавить. Работает редактирование, есть импорт из KML, загрузка из HLG и SLS. Нужно тестировать. Для начала желательно на простых контурах, а то мало ли вон какая бяка в мультилиниях вылезла внезапно.

zed

23-08-2015 13:39

руководитель   ~0016402

А не хочешь сделать, чтобы при редактировании дырки, перемещение точки ограничивалось внешним контуром и нельзя было бы вытянуть дырку за пределы контура?

vdemidov

24-08-2015 06:52

руководитель   ~0016403

Честно говоря, пока нет.

История изменений

Дата изменения Пользователь Поле Изменить
26-07-2013 07:34 vasketsov Новая задача
26-07-2013 07:35 vasketsov Связь добавлена блокирует 0001471
26-07-2013 07:39 vasketsov Дополнительные сведения изменены
26-07-2013 07:40 vasketsov Связь добавлена связана с 0001877
26-07-2013 08:25 vdemidov Комментарий добавлен: 0012208
31-07-2013 08:32 vdemidov Состояние новая => подтверждена
31-07-2013 08:32 vdemidov Версия продукта => 121010
31-07-2013 08:32 vdemidov Целевая версия => 43xxxx
25-04-2015 11:58 zed Комментарий добавлен: 0015742
25-04-2015 11:58 zed Связь заменена блокирует 0001877
25-04-2015 15:38 vasketsov Комментарий добавлен: 0015747
25-04-2015 15:41 zed Комментарий добавлен: 0015748
25-04-2015 15:58 vasketsov Комментарий добавлен: 0015749
05-05-2015 07:21 vdemidov Ответственный => vdemidov
05-05-2015 07:21 vdemidov Состояние подтверждена => назначена
05-05-2015 17:12 zed Комментарий добавлен: 0015858
05-05-2015 17:32 vdemidov Комментарий добавлен: 0015859
15-05-2015 19:58 vdemidov Метка добавлена: VIP
17-07-2015 18:03 zed Связь добавлена связана с 0002765
29-07-2015 14:56 vdemidov Метка добавлена: полигоны
09-08-2015 09:32 vdemidov Комментарий добавлен: 0016358
09-08-2015 14:02 zed Комментарий добавлен: 0016359
09-08-2015 14:09 vdemidov Комментарий добавлен: 0016360
09-08-2015 14:11 vdemidov Комментарий добавлен: 0016361
09-08-2015 14:14 vdemidov Комментарий добавлен: 0016362
09-08-2015 14:32 zed Комментарий добавлен: 0016363
09-08-2015 14:46 zed Комментарий добавлен: 0016364
09-08-2015 14:57 zed Комментарий добавлен: 0016365
18-08-2015 10:12 vdemidov Целевая версия 43xxxx => 150915
23-08-2015 13:30 vdemidov Комментарий добавлен: 0016401
23-08-2015 13:39 zed Комментарий добавлен: 0016402
24-08-2015 06:52 vdemidov Комментарий добавлен: 0016403
31-08-2015 09:20 vdemidov Состояние назначена => решена
31-08-2015 09:20 vdemidov Решена в версии => 150915
31-08-2015 09:20 vdemidov Решение открыта => решена
08-08-2025 13:24 zed Категория Хотелка => Хотелка / Feature request