void Measure::DrawAngle(QPainter * painter, const QPointF & p1, const QPointF & p2, const QPointF & p3)
{
constexpr int arcRadius = 15;
painter->drawLine(p1, p2);
painter->drawLine(p1, p3);
QRectF rect(p1.x() - arcRadius, p1.y() - arcRadius, arcRadius * 2, arcRadius * 2);
auto beginAngle = Measure::CalculateAngle(p1, QPointF(p1.x() + 10, p1.y()), p2);
if (p2.y() > p1.y()) {
beginAngle *= -1;
}
auto angle = Measure::CalculateAngle(p1, p2, p3);
if (JudgePointInLineLeftOrRight(p3, p1, p2)) {
angle = 360 - angle;
}
painter->drawArc(rect, beginAngle * 16, angle * 16);
}
bool Measure::JudgePointInLineLeftOrRight(const QPointF& p1, const QPointF& p2, const QPointF& p3)
{
QPointF v1 = p2 - p1;
QPointF v2 = p3 - p1;
double tmp = v2.x() * v1.y() - v2.y() * v1.x();
if (tmp < 0) {
return true;
}
return false;
}
double Measure::CalculateAngle(const QPointF& p1, const QPointF& p2, const QPointF& p3)
{
QPointF v1 = p2 - p1;
QPointF v2 = p3 - p1;
double mov1 = sqrt(v1.x()*v1.x() + v1.y()*v1.y());
double mov2 = sqrt(v2.x()*v2.x() + v2.y()*v2.y());
double cosAngle = (v1.x()*v2.x() + v1.y()*v2.y()) / (mov1*mov2);
auto angle = acos(cosAngle) / pi * 180;
return angle;
}
C++、Qt绘制角度圆弧,逆时针方向绘制,p1为夹角点,从p2绘制到p3
于 2024-02-01 10:52:43 首次发布