如何以直线为中心轴绘制矩形?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 }); }
关键说明
- 避免斜率计算:直接用向量运算处理垂直方向,不会出现直线垂直时斜率无穷大的异常
- 归一化偏移:确保无论直线长度如何,矩形的宽度都符合设定值
- 顶点计算:通过对起点和终点进行正负偏移,得到对称的四个顶点,保证直线是矩形的中心轴
内容的提问来源于stack exchange,提问作者kehan
相关产品推荐
相关产品推荐

