Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Firefox от Июль 02, 2010, 16:23



Название: полярная система координат
Отправлено: 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?


Название: Re: полярная система координат
Отправлено: ufna от Июль 02, 2010, 16:36
y=R*sin(fi) + y0
x=R*cos(fi) + x0

может быть так?


Название: Re: полярная система координат
Отправлено: Igors от Июль 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
...
 


Название: Re: полярная система координат
Отправлено: lit-uriy от Июль 02, 2010, 20:40
про спидометр можно посмотреть исходники:
Бланшет - Таймер духовки (Смотри прикрепление oventimer.zip)
QNeedleIndicator (http://qt-apps.org/content/show.php/QNeedleIndicator?content=118474)


Название: Re: полярная система координат
Отправлено: Firefox от Июль 03, 2010, 21:38
спасибо, попробую. а таймер духовки мне не подходит. я уже смотрела.


Название: Re: полярная система координат
Отправлено: lit-uriy от Июль 03, 2010, 22:59
>>а таймер духовки мне не подходит
а чем же он не подходит?


Название: Re: полярная система координат
Отправлено: Firefox от Июль 06, 2010, 23:55
у меня qt 4.3.3 там нет класса Vector2D, каким его можно заменить, или что подключить. версию qt другую поставить не могу так как это на работе.


Название: Re: полярная система координат
Отправлено: Igors от Июль 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();
}