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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Рисование дуги, заканчивающейся стрелкой  (Прочитано 4379 раз)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« : Июнь 03, 2014, 16:27 »

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

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июнь 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: немного подправил  Улыбающийся
« Последнее редактирование: Июнь 04, 2014, 09:34 от Igors » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Июнь 04, 2014, 16:24 »

Большое спасибо!
В Вашем примере вершины треугольника в мировых координатах?
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 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;
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Июнь 05, 2014, 10:01 »

Ещё раз спасибо!
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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