Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: GreatSnake от Июнь 03, 2014, 16:27



Название: Рисование дуги, заканчивающейся стрелкой
Отправлено: GreatSnake от Июнь 03, 2014, 16:27
Нужна помощь.
Имеются 2 линии исходящие из одной точки.
Требуется нарисовать между ними дугу, заканчивающуюся стрелкой в виде треугольника для отображения направления поворота.
С отрисовкой дуги проблем нет. Проблемы с отрисовкой треугольника.
Всё, конечно, хочется средствами Qt.
Заранее спасибо)


Название: Re: Рисование дуги, заканчивающейся стрелкой
Отправлено: Igors от Июнь 04, 2014, 09:20
Если есть дуга - значит есть центр (cntr), радиус (rad) и угол поворота (angle) в радианах. Задаете исходные 3 точки напр

Код
C++ (Qt)
QPointF p0(-2, 0);   // левая
QPointF p1(2, 0);   // правая
QPointF p2(0, 5);   // верхняя
 
// Куда будет перенесена точка тр-ка (0, 0)
QPointF ofs(cntr.x() + rad * cos(angle), cntr.y() + rad * sin(angle));
 
// для отрицательного угла направляем стрелку вниз
if (angle < 0) p2.setY(-p2.y());
 
// точки надо повернуть на angle и добавить ofs
p0_new = QPointF(p0.x() * cos(angle) - p0.y() * sin(angle),
                p0.y() * cos(angle) + p0.x() * sin(angle)) + ofs;
p1_new = // аналогично
p2_new = ..
Ну и рисуете тр-к новых точек. В общем - пресловутая матрица  :)

Edit: немного подправил  :)


Название: Re: Рисование дуги, заканчивающейся стрелкой
Отправлено: GreatSnake от Июнь 04, 2014, 16:24
Большое спасибо!
В Вашем примере вершины треугольника в мировых координатах?


Название: Re: Рисование дуги, заканчивающейся стрелкой
Отправлено: Igors от Июнь 05, 2014, 09:52
Большое спасибо!
В Вашем примере вершины треугольника в мировых координатах?
Нет, как бы мы назначаем систему координат тр-ка. Часто говорят "модельные координаты".
Для дуги рисуемой с помощью QPainter::drawArc все то же самое, только ofs и angle вычисляются чуть по-другому

Код
C++ (Qt)
// R - первый аргумент drawArc
// arc_angle - конечный угол в радианах (startAngle + spanAngle) / 16  / 180 * M_PI
 
// радиусы (полуоси) эллипса
qreal radX = R.width() / 2.0;
qreal radY = R.height() / 2.0;
 
// смещение
ofs = QPointF(R.center().x() + radX * cos(arc_angle), R.center().y() + radY * sin(arc_angle));
 
// угол поворота = углу касательной
qreal delta = M_PI / 180;
angle = atan2(radY * (sin(arc_angle) - sin(arg_angle - delta), radX * (cos(arc_angle) - cos(arg_angle - delta)));
 
// отнимаем PI / 2  т.к. исходная стрелка вдоль оси Y. Можно расположить ее по X, тогда отнимать не надо
angle -= M_PI / 2;


Название: Re: Рисование дуги, заканчивающейся стрелкой
Отправлено: GreatSnake от Июнь 05, 2014, 10:01
Ещё раз спасибо!