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

Поворот объекта добавленного в классификатор?

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3 4 След.
RSS
Поворот объекта добавленного в классификатор?
 
Добрый день!

Работаем над вращением векторного знака. Заметили,  что поворот осуществляется не корректно. Приводим скрин работы  приложения и код.
 
Код
int deltax = -300, deltay = 300;  
HOBJ obj=mapCreateSiteObject(hmap, hsite);  
DOUBLEPOINT pt;     pt.X=x1;  pt.Y=y1;    
ang=0.0*M_PI/180.0;  // Первый тест угол 0, далее 90 задаем (см. рис)  
mapRegisterObject(obj, 1772, LOCAL_VECTOR);   
mapAppendPointPlane(obj, x1, y1, 0);    
mapAppendPointPlane(obj, x1 + deltax/6, y1 + deltay/6, 0);    
mapRotateObject(obj, &pt, &ang);    
if (obj == 0){         return;     }  
mapCommitWithPlace(obj);    
uniq_key=mapObjectKey(obj);

Поворот на 0 градусов - https://yadi.sk/i/L2pUVcx8GuHwJw
Поворот на 90 градусов - https://yadi.sk/i/biEeuvvFu2YLJg

ПО документации написано, что поворот будет по часовой стрелке, по картинкам же мы видим, что поворот против часовой стрелки.

Подскажите, что мы делаем не так? Или как повернуть изображение корректно на заданный угол?


// Повернуть объект вокруг заданной в прямоугольной системе точки
// на заданный угол
// info   - идентификатор объекта карты в памяти
// center - координаты точки, вокруг которой поворачивается объект (метры)
// angle  - угол поворота по часовой стрелке (радианы, от -PI до +PI)
// При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapRotateObject(HOBJ info, DOUBLEPOINT *center, double *angle);
 
В более новой версии файла mapapi.h комментарий уже поправлен и имеет вид:
Код
 // Повернуть объект вокруг заданной в прямоугольной системе точки
 // на заданный угол
 // info   - идентификатор объекта карты в памяти
 // center - координаты точки, вокруг которой поворачивается объект (метры)
 // angle  - угол поворота против часовой стрелки (радианы, от -PI до +PI)
 // При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapRotateObject(HOBJ info, DOUBLEPOINT *center, double *angle);
Повороты выполняются против часовой стрелки. Для поворота по часовой стрелке можно задать отрицательное значение угла.
Извините за неточность.
 
Спасибо, но вы не полностью ответили на мой вопрос.
 
Вопрос:
ПО документации написано, что поворот будет по часовой стрелке, по картинкам же мы видим, что поворот против часовой стрелки.
Подскажите, что мы делаем не так? Или как повернуть изображение корректно на заданный угол?

Ответ:
Повороты выполняются против часовой стрелки. Для поворота по часовой стрелке можно задать отрицательное значение угла.


Векторный объект обычно рисуется по направлению второй точки. Применять функции поворота не обязательно, можно управлять второй точкой.
 
А почему 0 такой странный? Почему ноль не совпадает ни с северным нулем ни с тригонометрическим (12 часов, 15 часов)?
Изменено: Анастасия - 14.05.2019 16:11:02
 
Нулевое значение означает, что поворот не выполняется. Это относительное значение для поворота от текущего положения, а не азимут или дирекционный угол.
 
Цитата
Oleg Belenkov написал:
Нулевое значение означает, что поворот не выполняется. Это относительное значение для поворота от текущего положения, а не азимут или дирекционный угол.
Хорошо. Подскажите какой метод использовать для нахождения дирекционного угла объекта?
 
Здравствуйте!

Для нахождения дирекционного угла применяется функция mapSideDirection (mapapi.h):
Код
 // Вычисление дирекционного угла участка объекта (стороны)
 // Возвращает величину угла в радианах
 // Для последней точки вычисляет направление на первую точку
 // У замкнутых объектов первая и последняя точки совпадают
 // info  - идентификатор объекта карты в памяти
 // number - номер точки, начиная с 1
 // subject - номер подобъекта (если = 0, обрабатывается объект)
 // При ошибке возвращает 0 (при совпадении точек также)

_MAPIMP double _MAPAPI mapSideDirection(HOBJ info,long int number,
                                        long int subject/* = 0*/);
 
Цитата
Александр Савелов написал:
Здравствуйте!

Для нахождения дирекционного угла применяется функция mapSideDirection (mapapi.h):
Код
  // Вычисление дирекционного угла участка объекта (стороны)
 // Возвращает величину угла в радианах
 // Для последней точки вычисляет направление на первую точку
 // У замкнутых объектов первая и последняя точки совпадают
 // info  - идентификатор объекта карты в памяти
 // number - номер точки, начиная с 1
 // subject - номер подобъекта (если = 0, обрабатывается объект)
 // При ошибке возвращает 0 (при совпадении точек также)

_MAPIMP double _MAPAPI mapSideDirection(HOBJ info,long int number,
                                        long int subject/* = 0*/); 
number - уточните как получить номер?

Использовали этот метод, при первом запуске давал одно значение, а при последующих уже 0, причем не понятно 0 это значение угла или ошибка?

НЕ ясно какие именно должны быть входные значения long int number,                                         long int subject?
Изменено: Анастасия - 15.05.2019 10:33:55
 
Цитата
Анастасия написал:
number - уточните как получить номер?
В поле number указывается порядковый номер точки объекта от 1 до значения, возвращаемого функцией mapPointCount (mapapi.h):
Код
 // Запрос числа точек метрики объекта/подобъекта
 // info    - идентификатор объекта карты в памяти
 // subject - номер подобъекта (если = 0, обрабатывается объект)
 //           (если = -1, вернуть общее число точек всех контуров объекта)
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapPointCount(HOBJ info, long int subject);
В поле subject указывается либо 0 для обработки самого объекта, либо номер подобъекта от 1 до значения, возвращаемого функцией mapPolyCount (mapapi.h):
Код
// Запрос числа составных частей (подобъектов + 1)
 // info    - идентификатор объекта карты в памяти
 // Если подобъектов нет - возвращает 1 (только объект)
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapPolyCount(HOBJ info);
Дополнительно к предыдущему ответу уточняем алгоритм поворота на заданный угол относительно текущего дирекционного угла:
- запросить текущий дирекционный угол с помощью функции mapSideDirection (описано выше);
- вычислить разницу между необходимым значением угла и текущим дирекционным углом;
- выполнить поворот на полученное значение угла с помощью функции mapRotateObject.
Страницы: Пред. 1 2 3 4 След.
Читают тему (гостей: 1)



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

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