На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Поворот объекта

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2
RSS
Поворот объекта, Как повернуть объект?
 
В этом случае происходит не поворот объекта, а параллельный перенос
Изменено: Олег Капенов - 12.10.2009 07:21:02
 
Если нужно изменить направление объекта в той же точке, где он находится, то это можно сделать для знака с локализацией ВЕКТОРНЫЙ путем добавления второй точки метрики или обновления значения координат второй точки.
Кроме того, есть программируемые знаки в библиотеке Shape.IML, которую можно перенести в Linux (тексты есть в SDK). Там есть знаки - "Знак с поворотом по семантике" и "Знак с длиной и поворотом по семантике" для которых можно задать угол поворота в семантике.
 
Рассчет нового значения точки метрики для точечного объекта происходит по тем же формулам, что и для многоточечного. Только внешний вид точечного объекта при повороте не изменится. Для Вас целесообразней работать с векторным объектом. Выше дан исчерпывающий ответ.
 
Цитата
Oleg Belenkov написал:
Если нужно изменить направление объекта в той же точке, где он находится, то это можно сделать для знака с локализацией ВЕКТОРНЫЙ путем добавления второй точки метрики или обновления значения координат второй точки.
Кроме того, есть программируемые знаки в библиотеке Shape.IML, которую можно перенести в Linux (тексты есть в SDK). Там есть знаки - "Знак с поворотом по семантике" и "Знак с длиной и поворотом по семантике" для которых можно задать угол поворота в семантике.
Использую данный способ для поворота векторного объекта, то есть известны не только координаты объекта, но и угол поворота объекта относительно севера, однако есть одна проблема. Складывается такое впечатление, что объект будет поворачиваться, только если угол изменился на 10 градусов. Например, если задавать угол из диапазона 0..9 градусов, то объект не поворачивается, а как только укажу 10 - сразу поворачивается на указанные 10 градусов. Как будто есть некий фильтр углов по аналогии с функцией mapSetupTurn, в которой есть сектор фиксации. Вопрос: если это действительно так, то можно ли данный функционал отключить для функции mapRotateObject?
Код
// Версия библиотеки MapAccess
// (если применяется "mapacces.h" и т.п.)
#define MAPACCESSVERSION  20160418

// Версия интерфейса MAPAPI и ядра библиотеки
#define MAPAPIVERSION  0x0111302
 
Цитата
Alexander Kruzhkov написал:
примерно так
turnpointX = (pointX - centerX) * CosTurn - (pointY - centerY) * SinTurn + centerX;
turnpointY = (pointX - centerX) * SinTurn + (pointY - centerY) * CosTurn + centerY;
Попробовал сделать поворот, используя эти формулы - эффект тот же!
 
Дискретность вычислений угла поворота может увеличиваться в следующих случаях:

1. Используются целочисленные вычисления, либо с пониженной точностью (float вместо double).
2. Результат округляется до целых.
3. Слишком малый радиус поворота.
4. Ошибки в вычислении CosTurn, SinTurn (использование градусов вместо радиан).
5. Вычисление угла поворота с пониженной точностью, либо ошибки в вычислении угла.
 
Я делаю примерно так.
Первоначально при создании векторного объекта (код 732020530 из operator.rsc) в него добавляется 2 точки:        
Код
mapAppendPointPlane(hObj, x +  0, y); //оригинальные координаты объекта
//Если нужно изменить направление объекта в той же точке, где он находится,
//то это можно сделать для знака с локализацией ВЕКТОРНЫЙ путем добавления второй точки метрики или обновления значения координат второй точки.
mapAppendPointPlane(hObj, x + 100, y); //делаем направление на север
Теперь, при обновлении координаты объекта и его угла (градусы):        
Код
mapUpdatePointPlane(hObj, x, y, 1);
angle = angle * M_PI / 180.0; //переводим в радианы
//поворачиваем вторую точку объекта на нужное кол-во градусов вокруг первой
//при этом вторая точка находится на 100м выше на север
double turnx = 100 * std::cos(angle) - 0 + x;
double turny = 100 * std::sin(angle) + 0 + y;
mapUpdatePointPlane(hObj, turnx, turny, 2);
Переменные x,y и angle имеют тип double.
 
Возможно результат округляется при записи. Проверьте точность карты - в ГИС "Карта 2011" - главное меню - Задачи - Паспорт - Точность координат - микроны?

В структуре MAPREGISTEREX поле DeviceCapability = -1 (максимальная точность), см. mapapi.h:

 // Запросить паспортные данные векторной карты
 // Структуры MAPREGISTER и LISTREGISTER описаны в mapcreat.h
 // hmap - идентификатор открытых данных
 // sheetnumber - номер листа карты для
 // которого запрашиваются паспортные данные
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetMapInfo(HMAP hmap, long int sheetnumber,
                                      MAPREGISTER *map, LISTREGISTER *sheet);
_MAPIMP long int _MAPAPI mapGetMapInfoEx(HMAP hmap, long int sheetnumber,
                                        MAPREGISTEREX *map, LISTREGISTER *sheet);
 
У меня DeviceCapability получается 20000 (карта Подольска). То есть, такое поведение в таком случае считается нормальным?
 
Проверил создание объекта и редактирование на карте Подольска.

1. При создании нового объекта с указанием метрики типа IDDOUBLE2 и последующем редактировании метрика сохраняются с точностью до 0.000001 м
2. При редактировании существующего объекта карты и изменении координаты на 0.000001 м - изменения не сохраняются. Вероятно метрика объектов карты имеет пониженную точность (например: IDLONG2 или IDFLOAT2).

Выполнил сортировку карты (в ГИС) с максимальной точностью (мкм) - теперь при изменении координат на 0.000001 м изменения сохраняются.

P.S. см. mapapi.h
Код
 //  Запросить формат хранения метрики (IDSHORT2,...,IDDOUBLE3)
 //  При ошибке возвращает ноль, иначе - тип формата хранения метрики

_MAPIMP long int _MAPAPI mapGetObjectKind(HOBJ info);
// Установить максимальную точность хранения координат объекта
mapSetObjectKind(info, IDDOUBLE2);

// Выполнить поворот объекта
// ...
Страницы: Пред. 1 2
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности