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

如何以直线为中心轴绘制矩形?System.Drawing.Graphics扩展方法实现

以指定直线为中心轴绘制矩形的实现方法

要实现以给定直线为中心轴绘制矩形,核心是通过向量运算计算出矩形的四个顶点,避免直接计算斜率带来的除以零问题。具体步骤如下:

  • 计算直线的方向向量:用终点坐标减去起点坐标,得到向量 (dx, dy)
  • 生成垂直于直线的单位向量:垂直向量可取 (-dy, dx) 或 (dy, -dx),归一化后乘以矩形宽度的一半,得到向两侧偏移的距离
  • 计算矩形的四个顶点:分别对起点和终点进行正负偏移,得到四个顶点
  • 连接四个顶点完成矩形绘制

修正后的扩展方法代码如下:

using System.Drawing;
using System.Numerics; // 若使用System.Numerics.Vector3

public static void DrawRectangleWithLine(this Graphics g, Pen pen, Vector3 startPointPosition, Vector3 endPointPosition, int width)
{
    // 提取平面坐标(假设Z轴不参与2D绘制)
    float startX = startPointPosition.X;
    float startY = startPointPosition.Y;
    float endX = endPointPosition.X;
    float endY = endPointPosition.Y;

    // 计算直线方向向量
    float dx = endX - startX;
    float dy = endY - startY;

    // 计算方向向量的长度,用于归一化垂直向量
    float length = (float)Math.Sqrt(dx * dx + dy * dy);
    if (length == 0) return; // 起点终点重合,不绘制

    // 计算归一化的垂直向量(取其中一个垂直方向)
    float offsetX = -dy / length * width / 2f;
    float offsetY = dx / length * width / 2f;

    // 计算矩形的四个顶点
    PointF p1 = new PointF(startX + offsetX, startY + offsetY);
    PointF p2 = new PointF(endX + offsetX, endY + offsetY);
    PointF p3 = new PointF(endX - offsetX, endY - offsetY);
    PointF p4 = new PointF(startX - offsetX, startY - offsetY);

    // 绘制矩形的四条边
    g.DrawLine(pen, p1, p2);
    g.DrawLine(pen, p2, p3);
    g.DrawLine(pen, p3, p4);
    g.DrawLine(pen, p4, p1);

    // 也可以用DrawPolygon更简洁:
    // g.DrawPolygon(pen, new[] { p1, p2, p3, p4 });
}

关键说明

  1. 避免斜率计算:直接用向量运算处理垂直方向,不会出现直线垂直时斜率无穷大的异常
  2. 归一化偏移:确保无论直线长度如何,矩形的宽度都符合设定值
  3. 顶点计算:通过对起点和终点进行正负偏移,得到对称的四个顶点,保证直线是矩形的中心轴

内容的提问来源于stack exchange,提问作者kehan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:09:23