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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Нарисовать стрелку внутри rectangle  (Прочитано 4172 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #15 : Июль 23, 2023, 19:47 »

Цитировать
угол на котором они должны быть в направлении нужного значения это половина отрезка между ними
угол не может равняться половине отрезка, это разные величины

как я понимаю, calculatePoint вычисляет точку на маленькой окружности. по идее тебе достаточно добавить эту точку к каждой точке стрелки, при условии, что стрелка задана в относительных координатах, где (0,0) — это правый край маленькой окружности.

также можно задать стрелку для 0 градусов, а потом просто применять к ней QTransform-поворот вместо своих вычислений:
Код
C++ (Qt)
QPolygonF arrowPointingRight = {{x1, y1}, ...};
auto rotatedArrow = QTransform::fromTranslate(centerX, centerY).rotate(angle).map(arrowPointingRight);
можно такой поворот и к каждой отдельной точке применить при необходимости

З.Ы. лучше передавать double по значению
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #16 : Июль 23, 2023, 19:56 »


как я понимаю, calculatePoint вычисляет точку на маленькой окружности. по идее тебе достаточно добавить эту точку к каждой точке стрелки, при условии, что стрелка задана в относительных координатах, где (0,0) — это правый край маленькой окружности.

Не совсем, calculatePoint в случаи тикмарков высчитывает для них начало и конец, то есть 2 точки. И эту же функцию я и хотел использовать чтобы высчитывать каждую точку стрелки.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #17 : Июль 23, 2023, 21:36 »

а, ну да, там можно получить любую точку на луче, главное правильный радиус передать
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #18 : Июль 25, 2023, 17:17 »

Найден неплохой вариант, нахожденеи точек с отступом от центра стрелки, то есть нахождение угла наклона и после от него считать.
Вдруг кому пригодится.

Код:
QPointF calculatePoint(const double& radius, const double& angle, const double& offset)
{
    QPointF pointF;
    pointF.setX(m_MainCircleDiameter.value() / 2 + radius * qCos((std::numbers::pi * angle) / 180.0) - offset * qSin((std::numbers::pi * angle) / 180.0));
    pointF.setY(m_MainCircleDiameter.value() / 2 + radius * qSin((std::numbers::pi * angle) / 180.0) + offset * qCos((std::numbers::pi * angle) / 180.0));
    return pointF;
}


Офсет в данном случаи надо считать на сколько в бок отходят точки.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #19 : Июль 25, 2023, 21:42 »

нагуглил или геометрически вывел? Улыбающийся так вот сходу неочевидно откуда взялась формула. UPD: а, понял, это ж матрица поворота (и вот мы опять пришли к QTransform Улыбающийся ), а offset — это по сути ненулевая у-координата у точек по обе стороны центра стрелки.

можно немного улучшить код:
Код
C++ (Qt)
QPointF calculatePoint(double radius, double angle, double offset)
{
   const auto angleRads = std::numbers::pi * angle / 180.0;
   const auto sinA = qSin(angleRads);
   const auto cosA = qCos(angleRads);
 
   QPointF pointF{m_MainCircleDiameter.value() / 2, m_MainCircleDiameter.value() / 2};
   pointF.rx() += radius * cosA - offset * sinA;
   pointF.ry() += radius * sinA + offset * cosA;
   return pointF;
}
« Последнее редактирование: Июль 25, 2023, 22:01 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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