You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已知偏移量如何计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 20:24:08