已知偏移量如何计算QLine外接QRect的全部坐标点
线段偏移外接矩形求解方案
代数推导步骤
已知线段端点A(x₁, y₁)、B(x₂, y₂),偏移量为d,按如下步骤计算矩形四个顶点:
- 第一步:计算线段方向向量
方向向量vecAB = (dx, dy) = (x₂ - x₁, y₂ - y₁)
线段长度len = √(dx² + dy²),若len为0说明线段退化为点,直接返回中心为A、边长为2d的正方形即可 - 第二步:计算单位法向量
和线段垂直的两个单位法向量分别为:unitN₁ = (-dy/len, dx/len)、unitN₂ = (dy/len, -dx/len) - 第三步:偏移端点得到矩形顶点
将A、B分别沿两个法向量方向偏移d距离,得到四个顶点:- P₁ = A + unitN₁ × d
- P₂ = B + unitN₁ × d
- P₃ = B + unitN₂ × d
- P₄ = A + unitN₂ × d
四个点按顺序连接即为所需的外接矩形,可直接用于构造QRect或QPolygon。
Qt场景快速实现
如果是在Qt环境下使用,可直接借助Qt的变换API简化计算,无需手动实现向量运算:
#include <QLineF> #include <QTransform> #include <QPolygonF> QPolygonF getLineOffsetRect(QLineF line, qreal offset) { if (line.isNull()) { // 线段退化为点时返回正方形 QPointF p = line.p1(); return QPolygonF(QRectF(p.x()-offset, p.y()-offset, offset*2, offset*2)); } qreal rad = qDegreesToRadians(line.angle()); // 构造两个垂直于线段方向的偏移变换 QTransform transUp, transDown; transUp.translate(offset * qSin(rad), offset * qCos(rad)); transDown.translate(-offset * qSin(rad), -offset * qCos(rad)); // 映射端点得到四个顶点 return QPolygonF({ transUp.map(line.p1()), transUp.map(line.p2()), transDown.map(line.p2()), transDown.map(line.p1()) }); }
内容的提问来源于stack exchange,提问作者tildnohn
相关产品推荐
相关产品推荐

