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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Нарисовать линию со стрелкой  (Прочитано 17859 раз)
n4ela
Гость
« : Октябрь 16, 2009, 22:48 »

Рисую линии через drawLine.
Нужно сделать на конце линии стрелку в какую сторону она указывает. Я так понимаю что нарисовать указатель надо по втором координатам drawLine.
Может в Qt есть какой то ключ для setPen'a?
Стрелки указывают в разные стороны под разным углом и я вообще не понимаю как можно нарисовать их вручную.
Примеры смотрел, но там показано как рисовать линию что бы на конце был видит указатель мыши, а это совсем не то.
Записан
_OLEGator_
Гость
« Ответ #1 : Октябрь 16, 2009, 22:56 »

Можно посмотреть в сторону QPainter::translate(), QLineF::angle(), QPainter::rotate()

1) QPainter::translate(координата_конца)
2) QPainter::rotate( QLineF::angle() +- необходимый_угол )
и отрисовать необходимой длины линию
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #2 : Октябрь 17, 2009, 00:03 »

хочешь сказать, что этот пример ничего не проясняет:
http://www.doc.crossplatform.ru/qt/4.3.2/painting-transformations.html
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Октябрь 17, 2009, 00:38 »

используй QPoligon и методы из QPainter работающие с ним - drawPligon и т.д. - можно только кончик стрелки ими рисовать, можно всю
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 17, 2009, 02:17 »

Рисую линии через drawLine.
Нужно сделать на конце линии стрелку в какую сторону она указывает. Я так понимаю что нарисовать указатель надо по втором координатам drawLine.
Может в Qt есть какой то ключ для setPen'a?
Стрелки указывают в разные стороны под разным углом и я вообще не понимаю как можно нарисовать их вручную.
Примеры смотрел, но там показано как рисовать линию что бы на конце был видит указатель мыши, а это совсем не то.
Может быть и есть "умный способ" (т.е. где-то уже сделано) но я такого не знаю и искать не буду Улыбающийся Есть линия заданная 2-мя точками p0(x, y) и p1(x, y). Для нее надо нарисовать стрелку заданную 2 параметрами:

arrow_len - длина стрелки
arrow_width - ширина стрелки

Ну так и погнали в векторах. Псевдокод

Код:
Point2D direction = (p1 - p0).normalize();
Point2D normal(-direction.y, direction.x);
Point2D arrow_middle = p1 - direction * arrow_len;
Point2D t0 = arrow_middle + normal * arrow_width;
Point2D t1 = arrow_middle - normal * arrow_width;
FillTriangle(t0, t1, p1);

 
« Последнее редактирование: Октябрь 17, 2009, 09:56 от Igors » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Октябрь 17, 2009, 21:12 »

че мудрить???
бери QPoligon и пихай в него 3 точки (предположим что рисуем только наконечник стрелочки)

QPoligon poligon;
polygon << QPoint( 0, -arrow_width );
polygon << QPoint( -arrow_len, 0 );
polygon << QPoint( 0, arrow_width );

--- фактически получили наконечник направленный вниз (возьми тетрадку вклеточку поставь 0,0 в произвольной точке и проставь мои точки туда, потом соедини линиями)

там где ты рисуешь делай так: painter->drawConvexPolygon( polygon );


или если надо повернуть на заданный угол:

   painter->save();
   double arrowAngle = Непонимающий???НАДО ЗАДАТЬ;
   painter->rotate( -arrowAngle );
   painter->drawConvexPolygon( polygon );
   painter->restore();

вот чего мне удаось добиться таким способом - в рисунке:
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Октябрь 18, 2009, 15:27 »

   double arrowAngle = Непонимающий???НАДО ЗАДАТЬ;
Для линии заданной точками p0, p1
Код:
angle = atan2(p1.y - p0.y, p1.x - p0.x);
Да еще не забыть поставить центр в p1.

   че мудрить???
То есть рассчитать 3 точки на плоскости - значит "мудрить" Улыбающийся ?


Записан
n4ela
Гость
« Ответ #7 : Октябрь 19, 2009, 16:00 »

Всем спасибо, получилось нарисовать как надо.
Записан
Drafter
Гость
« Ответ #8 : Июнь 07, 2010, 23:46 »

Возможно, кому-то придётся ко двору более подробное решение Улыбающийся.
Тут рисуется классическая стрелка, типа --->

Код:
        QPolygon arrow;
        arrow << QPoint(0, -arrowWidth/2)
              << QPoint(arrowHeight, 0)
              << QPoint(0, arrowWidth/2);

        QPointF p0(beginPoint);
        QPointF p1(endPoint);
        double dx = p1.x() - p0.x();
        double dy = p1.y() - p0.y();
        double angle = atan2(dy, dx);
        QPointF p2(p1.x() - arrowHeight * cos(angle),
                   p1.y() - arrowHeight * sin(angle));
        double lineLen = sqrt(dx*dx + dy*dy);

        if(lineLen >= arrowHeight){
            painter.drawLine(p0, p2);
        }
        painter.save();
        painter.translate(p2);
        painter.rotate(180/3.14159 * angle);
        painter.drawConvexPolygon(arrow);
        painter.restore();
« Последнее редактирование: Июнь 08, 2010, 10:16 от Drafter » Записан
SASA
Гость
« Ответ #9 : Июнь 09, 2010, 10:40 »

Я рисовал так:
- создаём линию QLineF
- отрисовываем
- поворачиваем на нужный угол QLineF::setAngle ( qreal angle )
- уменьшаем длину QLineF::setLength ( qreal length )
- отрисовываем (первая половина стрелочки)
- поворачиваем на другую сторону линии QLineF::setAngle ( qreal angle )
- отрисовываем (вторая половина стрелочки)

Если нужна стрелка с другой стороны, то нужно поменять координаты начала и конца линии.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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