@BlinCT

Как найти точки для обьекта и нарисовать его?

Всем добрый вечер.
Имеется такой вот тахометр 64bd72c6e6e7b413698930.png
Как видно стрелка она не из центра а на небольшом растоянии от центрального круга.
При смене текущего значения высчитывается угол и стрелка поворачивается.
Но мне надо ее нарисовать по точкам, 5 точек. И каждый раз при смене значения нужно будет пересчитать точки и стрелка будет передвигатся по окружности.
Вопрос: как можно найти или расчитать эти 5 точек для стрелки если имеются размеры обьектов, окружности, радиус, высота и ширина стрелки?
Если говорить о коде то я использую вот такую функцию для нахождения 1 точки имея высчитаный угол и радиус внешней окружности
QPointF Needle::calculatePoint(const double& radius, const double& angle)
{
    QPointF pointF;
    pointF.setX(m_MainCircleDiameter.value() / 2 + radius * qCos((M_PI * angle) / 180.0));
    pointF.setY(m_MainCircleDiameter.value() / 2 + radius * qSin((M_PI * angle) / 180.0));
    return pointF;
}
  • Вопрос задан
  • 50 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Точно так же, как вы в проедыдущем вопросе находили координаты тик-марков, вы можете тут найти 2 координаты - пятая точка на острие стрелки и центр короткой стороны. Теперь, можно ввести систему координат из центра окружности так, чтобы ось ox шла вдоль стрелки. Для этого вам надо найти 2 перпендикулярных вектора. Один у вас уже есть - это вектор между двумя известными уже точками. Он же будет cos(alpha), sin(alpha). Перпендикулярный вектор будет -sin(alpha), cos(alpha). Теперь надо только взять координаты 5 точек в этой системе координат (как будто бы стрелка лежит горизонтально) и сложить x, помноженный на первый вектор с у помноженным на 2 вектор.

В итоге будет что-то вроде:
x' = x*cosa + y*sina
y' = -x*sina + y*cosa


Это же выражение является заодно матрцей поворота на угол alpha.

А координаты там что-то вроде: {r0, w/2}, {r0, -w/2}, {r1, -w/2}, {r1 + w/2, 0}, {r1, w/2}, гже r0, r1 - радиусы окружностей между которыми стрелка натянута. w - ширина стрелки. Эти пары подставляйте ввиде x,y в формулу выше и получите x', y' - координаты точек на экране.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы