• Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    65cb44c5d9772744116915.png
    Вот как на картинке 4 должно быть ромба, но я пока пытаюсь один нарисовать, но с точками что то не так я считаю.
    Есл ия правильно понимаю то дял расчетов мне нужен только радиус внешнего кольца и угол в какой значении помещается первая точка, я прав?
    Написано
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    Для вторйо точки уже будет отступ и он прилетит в offset, но мне хотябы понять что у меня с первой точкой не так. Как будто я что то упускаю в расчетах
    Написано
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    Добрый день.
    Наверное не очень хорошо писать в теме которая уже была закрыта, но вопрос возник про расчеты что касаются данной темы.
    Пытаюсь получить точки для создания обькта типа "ромб", и нарисовать его точно за внешним кругом. То есть первая точка должна быть на границе круга.
    Могли бы снова помочь с расчетом? Я почему то поулчаю для точек по х значения на подобии 350, 370. И не понимаю где ошибка.
    Функция сама вот такая как мы с вами и разбирали
    QPointF pointF;
        auto calcAngle = (std::numbers::pi_v<qreal> * angle) / 180.0;
        pointF.setX((radius + (radius * qCos(calcAngle)) - offset * qSin(calcAngle)));
        pointF.setY((radius + (radius * qSin(calcAngle)) + offset * qCos(calcAngle)));
        return pointF;


    Тут angle например дял первой точки это -30 а radius это значение 180
    Написано
  • Как сделать свой домашний NAS в качестве облака и медиацентра?

    @BlinCT Автор вопроса
    Drno, Спасибо огромное за совет. Еще вопрос, можете посоветовать на счет безопасности? По факту через точку доступа он будет смотреть в инет, чтобы я мог через приложенеи конектится. Ну и само собою он будет доступен во внутреней сети(домашняя).
    Написано
  • Как сделать свой домашний NAS в качестве облака и медиацентра?

    @BlinCT Автор вопроса
    То есть железка, на нее линукс любой по сути накатывать и уже само управление облаком nextcloud, понял.
    А почему это не является в конечном итоге NAS?
    И на счет медиосервиса, как понимаю уже на компе он должен стоять и с сервака получать весь перечень фильмов и музыки?
    На счет дисков и раидов еще можете что посоветовать?
    Написано
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    Wataru, возможно я что-то нашел в расчетах то чт оя использовал. Может вы сможете мне с диапазоном подсказать.
    Если я для полученяи угла использую вот такие значения
    angleValueTransformer.setAngleRangeDegrees(CTcm_ValueRange<double>(-60, 240));
        angleValueTransformer.setValueRange(CTcm_ValueRange<double>(m_ValueRange.m_Min, m_ValueRange.m_Max));
        angleValueTransformer.setCurrentValue(m_NeedleValue);

    То вот так выглядит угол для значения 0
    64e72d4e6022c885743611.png
    А вот так для значения 200
    64e72d6134f00595872831.png
    Получается что на 180 градусов перевернуто.
    Вопрос в этих 2 значениях -60, 240. Не понимаю как их надо сдвинуть чтобы перевернуть на 180 градусов.
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    Кстати по поводу значений 130 и 320 , обьект Shape в Qt рисует по часовой стрелке. По этому 130 как раз правильно
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    Wataru, в общем пока рисование не так важно. Так как с теми значениями все равно верно выходит. Главное бы понятьс формулой.
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    В общем вот так написал
    auto alpha = ((std::numbers::pi_v<qreal> / 2) - ((m_NeedleValue * (std::numbers::pi_v<qreal>) * ( 5.0 / 6.0)) / m_ValueRange.m_Max ));

    где m_Max это в данном случаи максимальное 200.0, значение в m_NeedleValue равно 0
    и вот как выглядит 64e71b2651400476955872.png
    там не точно по центру, немного вниз смотрит.
    Дальше я угол этот передаю дял высчитывания 5 точек стрелки.
    QPointF pointF;
    auto calcAngle = (std::numbers::pi_v * angle) / 180.0;
    pointF.setX((m_MainCircleRadius + (radius * qCos(calcAngle)) - offset * qSin(calcAngle)));
    pointF.setY((m_MainCircleRadius + (radius * qSin(calcAngle)) + offset * qCos(calcAngle)));
    return pointF;

    offset это для 4 точек отступ от центра.
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    Wataru, вот так выглядит если я беру ваши значения -70 и 250
    64e7113c72007564843435.png
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    Wataru, по поводу 0 где начинается, так это я написал в графике где распологается у обьекта Shape начальное значение. То есть мне получается надо исходя из этого и в С++ расчеты делать учитывая это.
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    В общем я попробовал вашу формулу написать в коде
    auto alpha = ((std::numbers::pi_v<qreal> / 2) - ((m_NeedleValue * 5) / 1200.0 ));
        qDebug() << "Value: " << m_NeedleValue << "alpha" << alpha;

    А вот результат вычеслений
    Value: 50 alpha 1.36246
    Value: 0 alpha 1.5708

    Если честно то я не уверен правильно ли я вообще использую ваш пример формулы, так как не понимаю ее до конца.
  • Нужно ли переводить из градусов в радианы для правильного направления стрелки?

    @BlinCT Автор вопроса
    110 и 320 это самое начало и самый конец дуги. А начальные точки со значениями, в даннмо случаи это -200 и 200 это как раз тикмарки со значениями 120 и 310. Хотя, после ваших слов я чет задумался и мне кажется я и тикмарки не высчитываю походу как надо. Я же даже для них в радианы не перевожу. И по воду значений на тахометре, там могут быть не только от -200 до 200, но и от 0 до 100. Вертикально вверх будет 50.
    Попробую расчитать как вы посоветовали.
    Вот так у меня выглядит формула для направленяи стрелки.
    QPointF pointF;
        auto calcAngle = (std::numbers::pi_v<qreal> * angle) / 180.0;
        pointF.setX((m_MainCircleRadius + (radius * qCos(calcAngle)) * qSin(calcAngle)));
        pointF.setY((m_MainCircleRadius + (radius * qSin(calcAngle)) * qCos(calcAngle)));
        return pointF;


    И само значение angle это как раз то что я получу после расчетов кода выше из angleValueTransformer. Но как вы сказали я значения не правильно передаю.
    Могли бы вы пожалуйста расписать точно формулу для того что вместо -200 и для 200?
    alpha = pi/2 - speed*5/1200.0
    pi/2 это понятно, а вот другие значения не совсем мне ясны.
  • Как найти точки для обьекта и нарисовать его?

    @BlinCT Автор вопроса
    Wataru, Спасибо, поправил. теперь выглядит по человечески) и главное по вашему описанию я разобрался.
    64bfd6d2390f3871723453.png

    Вопрос такой, вы случайно не работали с маштабированием текста?
    Вот тут правильно надписи распологаются, а на верхней очень криво.
    64bfd774f41ad189438330.png
  • Как найти точки для обьекта и нарисовать его?

    @BlinCT Автор вопроса
    Wataru, добрый день. Спасибо за вчерашнйи пример, почти получилось.
    Вот с таким поиском точек
    // starting point, arrow top
        auto firstPoint = calculatePoint((centralCircleDiameter / 2.0 + m_indentFromCircleForNeedle) + m_NeedleHeight.value(), m_AngleNeedle, 0);
        points.append(firstPoint);
    
        auto secondPoint = calculatePoint(centralCircleDiameter / 2.0 - 5, m_AngleNeedle, -m_NeedleWidth.value() / 2.0);
        points.append(secondPoint);
    
        auto thirdPoint = calculatePoint(centralCircleDiameter / 2.0 + m_indentFromCircleForNeedle, m_AngleNeedle, -(m_NeedleWidth.value() / 2.0));
        points.append(thirdPoint);
    
        auto firthPoint = calculatePoint(centralCircleDiameter / 2.0 + m_indentFromCircleForNeedle, m_AngleNeedle, m_NeedleWidth.value() / 2.0);
        points.append(firthPoint);
    
        auto fifthPoint = calculatePoint(centralCircleDiameter / 2.0 - 5, m_AngleNeedle, m_NeedleWidth.value() / 2.0);
        points.append(fifthPoint);
    
        // last point, arrow top.
        auto sixthPoint = calculatePoint((centralCircleDiameter / 2.0 + m_indentFromCircleForNeedle) + m_NeedleHeight.value(), m_AngleNeedle, 0);
        points.append(sixthPoint);


    у меня выходит вот такая стрелка
    64bfa1217a48f773812276.png
    как видите я беру такие параметры как диаметр центрального, потмо отступ для промежутка между ним и стрелкой, и высоту необходимую. Нижние 2 точки поулчаются как надо, а вот 2 верхние перед центральной, что-то ен очень. Может надо к ним еще процентр брать от длинны стрелки?
  • Как найти точки для обьекта и нарисовать его?

    @BlinCT Автор вопроса
    не могли бы вы абстрактным С++ кодом с названиями точек и векторов описать? Вроде все понятно что описали вы, но чет путаница с порядком у меня...
    То есть с первой точкой что на конце стрелки я понял, это как раз диаметр внешнего круга плюс радиус умноженый на косинус и синус угла. Это я получаю.
    //первая точка
    calculatePoint(mainCircleDiameter / 2, m_AngleNeedle); // вызов функции та что ниже
    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;
    }

    Думаю что считаю я правильно.
    Но вот другие точки
  • Как найти точки для обьекта и нарисовать его?

    @BlinCT Автор вопроса
    Снова спасибо за ответ вам.
    Пара уточнений, я могу получить угол, то есть через него проходит центр стрелки как вы написали выше, а вот потом нахождение точек двух нижних вы написали что он известен. Но я знаю только ширину и длинну самой стрелки но я не знаю еще точки эти.
    Ниже кусок кода, поправте если я не правильно начинаю высчиытвать 3 и 4 точки(те что нижние и ближе к центральному кругу)

    angleValueTransformer.setCurrentValue(data.m_CurrentValue);
    
    // находим угол для центра стрелки
        m_AngleNeedle = angleValueTransformer.calculateCurrentAngle();
    
        auto firstPoint = calculatePoint(mainCircleDiameter / 2, m_AngleNeedle);
    
        QPointF pointF;
        pointF.setX(m_MainCircleDiameter.value() / 2 + mainCircleDiameter / 2 * qCos((M_PI * m_AngleNeedle(тут нужно значение ширины стрелки на 2)) / 180.0));
        pointF.setY(m_MainCircleDiameter.value() / 2 + mainCircleDiameter / 2 * qSin((M_PI * m_AngleNeedle(тут нужно значение ширины стрелки на 2)) / 180.0));
  • Как найти точки на дуге?

    @BlinCT Автор вопроса
    Wataru, спасибо за советы и помощь. Получилось все сделать почти так как задумано). с поиском формул а еще и понять было не просто до того как вы обьяснили.
  • Как найти точки на дуге?

    @BlinCT Автор вопроса
    Wataru, 64b4568f2db64828619516.png
    вот тут на концах. Да это такие же тикмарки, но к ним нету ни значений ни углов. Но известно что они на концах.
  • Как найти точки на дуге?

    @BlinCT Автор вопроса
    Wataru, Если вы посмотрите на картинку в начале то там видно в начале и в конце тикмарки. Для них у меня нету ничего кроме длинны и ширины. И мне надо их поместить на данные позиции дуги. Вопрос какие данные для вычисления нужны будут?