angleValueTransformer.setAngleRangeDegrees(ValueRange<double>(120, 310));
angleValueTransformer.setValueRange(ValueRange<double>(m_ValueRange.m_Min, m_ValueRange.m_Max));
angleValueTransformer.setCurrentValue(m_NeedleValue);
alpha = pi/2 - speed*5/1200.0
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;
auto alpha = ((std::numbers::pi_v<qreal> / 2) - ((m_NeedleValue * 5) / 1200.0 ));
qDebug() << "Value: " << m_NeedleValue << "alpha" << alpha;
130 и 320 это самое начало и самый конец дуги.
Вот так у меня выглядит формула для направленяи стрелки.
pi/2 - speed*pi*5/6 / 200
auto alpha = ((std::numbers::pi_v<qreal> / 2) - ((m_NeedleValue * (std::numbers::pi_v<qreal>) * ( 5.0 / 6.0)) / m_ValueRange.m_Max ));
angleValueTransformer.setAngleRangeDegrees(CTcm_ValueRange<double>(-60, 240));
angleValueTransformer.setValueRange(CTcm_ValueRange<double>(m_ValueRange.m_Min, m_ValueRange.m_Max));
angleValueTransformer.setCurrentValue(m_NeedleValue);
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;
Transformer angleValueTransformer;
angleValueTransformer.setAngleRangeDegrees(CTcm_ValueRange<double>(60, -240));
angleValueTransformer.setValueRange(CTcm_ValueRange<double>(m_ValueRange.m_Max, m_ValueRange.m_Min));
angleValueTransformer.setCurrentValue(m_LimitValue);
transformer.setAngleRangeDegrees(ValueRange<double>(60, -240));
transformer.setValueRange(ValueRange<double>(m_ValueRange.m_Max, m_ValueRange.m_Min));
transformer.setCurrentValue(m_ShapeValue);
m_AngleShape = transformer.calculateCurrentAngle();
qreal calcStep = getShapeLength().value() - m_ShapeTopStep.value(); // это я делаю отступ для боковой точки(левая и правая)
auto firstPoint = calculatePoint((m_MainCircleRadius + getShapeLength().value()), getShapeAngle().value(), 0);
points.append(firstPoint);
auto secondPoint = calculatePoint((m_MainCircleRadius + calcStep), getShapeAngle().value(), -getShapeWidth().value() / 2.0);
points.append(secondPoint);
// метод расчета точек
QPointF ShapeObject::calculatePoint(const qreal& radius, const double& angle, const qreal& offset)
{
QPointF pointF;
auto calcAngle = (std::numbers::pi_v<qreal> * 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;
}
m_ValueRange - это диапазон значение от и до, в моем примере это от -100 до 100
m_MainCircleRadius - это радиус внешнего кольца за которым я и хочу поместить нужные мне ромбы
так, взял я как вы предложили интервалы од 240 до -60 и обьекты ромб появились с другой строны, то есть на 180 градусов от нужной позиции. А вот если 60 и -240 то на правильном.
transformer.setValueRange(ValueRange<double>(m_ValueRange.m_Max, m_ValueRange.m_Min));
auto firstPoint = calculatePoint((m_MainCircleRadius), getShapeAngle().value(), 0); // первая точка, на окружности
points.append(firstPoint);
auto secondPoint = calculatePoint((m_MainCircleRadius + calcStep), getShapeAngle().value(), -getShapeWidth().value() / 2.0); // вторая точка, левая сторона ромба
points.append(secondPoint);
auto thirdPoint = calculatePoint(m_MainCircleRadius + getShapeLength().value(), getShapeAngle().value(), 0); // трелья точка, верхняя точка, отступ от первой в длинну ромба
points.append(thirdPoint);
auto firthPoint = calculatePoint(m_MainCircleRadius - calcStep, getShapeAngle().value(), getShapeWidth().value() / 2.0); // четвертая точка, правая сторона ромба
points.append(firthPoint);
// last point, arrow top.
auto fifthPoint = firstPoint; // последняя точка, копия первой
points.append(fifthPoint);
Transformer angleValueTransformer;
angleValueTransformer.setAngleRangeDegrees(CTcm_ValueRange<double>(-240, 60));
angleValueTransformer.setValueRange(CTcm_ValueRange<double>(m_ValueRange.m_Max, m_ValueRange.m_Min));
auto angle = angleValueTransformer.setCurrentValue(value);
ShapePath
{
id: trackShapeAlarm
capStyle: Qt.FlatCap
fillColor: "transparent"
strokeColor: "red"
strokeWidth: root.pelData.mainCircleBorderWidth
PathAngleArc
{
centerX: root.size / 2
centerY: root.size / 2
radiusX: (root.size / 2.0) - (root.trackWidth / 2.0)
radiusY: (root.size / 2.0) - (root.trackWidth / 2.0)
startAngle: root.pelData.startAngleAlarmShape
sweepAngle: root.pelData.sweepAngleAlarmShape
}
}