Russian Qt Forum
Ноябрь 23, 2024, 01:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: полярная система координат  (Прочитано 9476 раз)
Firefox
Гость
« : Июль 02, 2010, 16:23 »

Здравствуйте. не могу вот сообразить. надо на форме нарисовать подобие спидометра, чтоб не заморачиваться взяла изображение. собираюсь только рисовать стрелку, которая будет двигаться. но на форме декартова система координат. точку соответствующую центру спидометра знаю. теперь необходима по данным скорости повернуть стрелку на определённый угол. можно опытным путём вычислить поворот на 1 деление на рисунке какому углу соответствует. и надо вычислить координаты точки конца стрелки. знаю что есть полярная система координат там x=R*cos(fi), y=R*sin(fi), но это если центр окружности в начале координат. но у нас не так и центр в левом углу формы.fi -я буду знать, радиус окружности в общем тоже подстроить можно. но не как не соображу как правильно точку построить вторую. всё время попадает не на ту отметку на окружности. пробовала x=R*sin(fi) + x0 - где x0 координата центра окружности.y=R*sin(fi)+y0. может есть какой-то другой способ циклического перемещения точки по окружности радиуса R?
Записан
ufna
Гость
« Ответ #1 : Июль 02, 2010, 16:36 »

y=R*sin(fi) + y0
x=R*cos(fi) + x0

может быть так?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июль 02, 2010, 20:15 »

Ну полярная система координат здесь ни при чем. Как я понял, у Вас есть картинка спидометра. Снимите с нее 3 точки

- p0 (координаты центра, там где конец стрелки прикреплен)
- p1 (координаты крайней левой риски)
- p2 (координаты крайней правой риски)

Теперь находим параметры
Код
C++ (Qt)
QVector2D p0. p1. p2;
// заполняем p0. p1. p2 точами картинки
 
QVector2D v01 = p1 - p0;
qreal len01 = v01.length();
v01 /= len01;
 
QVector2D v02 = p2 - p0;
qreal len02 = v02.length();
v02 /= len02;
 
qreal theRadius = (len01 + len02) * 0.5f;        // радиуc
qreal theAngleRange = acos(dotProduct(v01, v02));  // угол раствора в радианах
qreal theStartAngle = acos(v01.x());             // "левый угол" в радианах
 
if (v01.y() < 0.0f) {                              // раствор > 180 градусов
theStartAngle = PI * 2 - theStartAngle;
theAngleRange = PI * 2 - theAngleRange;
}
 

Использование: пусть спидометр имеет 10 делений, надо поставить стрелку на 2-е
Код
C++ (Qt)
qreal angle = theStartAngle - theAngleRange * 0.2f;
QVector2D theP(theRadius * cos(angle), theRadius * sin(angle));
theP += p0;                                  
 
// рисуем стрелку используя 2 точки: p0 и theP
...
 
« Последнее редактирование: Июль 03, 2010, 21:57 от Igors » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Июль 02, 2010, 20:40 »

про спидометр можно посмотреть исходники:
Бланшет - Таймер духовки (Смотри прикрепление oventimer.zip)
QNeedleIndicator
Записан

Юра.
Firefox
Гость
« Ответ #4 : Июль 03, 2010, 21:38 »

спасибо, попробую. а таймер духовки мне не подходит. я уже смотрела.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Июль 03, 2010, 22:59 »

>>а таймер духовки мне не подходит
а чем же он не подходит?
Записан

Юра.
Firefox
Гость
« Ответ #6 : Июль 06, 2010, 23:55 »

у меня qt 4.3.3 там нет класса Vector2D, каким его можно заменить, или что подключить. версию qt другую поставить не могу так как это на работе.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июль 07, 2010, 03:40 »

у меня qt 4.3.3 там нет класса Vector2D, каким его можно заменить, или что подключить. версию qt другую поставить не могу так как это на работе.
Возьмите QPointF и допишите пару ф-ций

Код
C++ (Qt)
inline qreal length( const QPointF & p )
{
return sqrt(p.x() * p.x() + p.y() * p.y());
}
 
inline qreal dotProduct( const QPointF & p0, const QPointF & p1 )
{
return p0.x() * p1.x() + p0.y() * p1.y();
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.101 секунд. Запросов: 23.