1. 简介

在本文中,我们将介绍一种用于膨胀(inflate)或收缩(deflate)多边形的算法。这个过程在图形处理、地理信息系统(GIS)、CAD 设计等领域中非常常见。我们不仅会讲解如何进行简单的缩放(homothety),还会深入探讨更复杂的多边形偏移(offsetting)操作。

2. 一般形式的位似变换(Homothety)

我们以一个简单的图形——正方形为例。想象我们将其放大或缩小,这种操作被称为位似变换(homothetic transformation)空间均匀缩放(homogeneous dilation)

MySceneScaling

假设我们有一个由顶点集合 $ V = {(x_1,y_1), (x_2,y_2),...,(x_n,y_n)} $ 构成的多边形,我们选择一个中心点 $ S = (s_x, s_y) $ 作为位似中心。再选定一个比例因子 $ \lambda \in \mathbb{R} $,那么每个顶点 $ v = (v_x, v_y) $ 的变换后坐标 $ v' = H(v) $ 可以表示为:

$$ v' = S + \lambda \cdot \vec{Sv} $$

或者更具体地写为:

$$ (v'_x, v'_y) = (S_x + \lambda (v_x - S_x), S_y + \lambda (v_y - S_y)) $$

这个公式是位似变换的核心。

3. 均匀缩放(Uniform Scaling)作为特例

当位似中心为原点 $ (S_x, S_y) = (0, 0) $ 时,变换公式简化为:

$$ (v'_x, v'_y) = (\lambda v_x, \lambda v_y) $$

这种情况被称为均匀缩放(uniform scaling),其中 $ \lambda $ 称为缩放因子

✅ 优点:计算简单,适合对称图形。
❌ 缺点:不能保持图形边缘与原图等距。

4. 位似变换 vs. 图形偏移(Offsetting)

有时候我们不仅希望放大或缩小图形,还希望新图形的每一点都与原图形最近点保持固定距离。这种操作称为图形偏移(offsetting),也叫多边形缓冲(polygon buffering)

例如,对一个圆形进行缩放时,如果以圆心为中心,其位似变换可以满足等距要求;但对于多边形来说,位似变换通常不能满足等距约束

⚠️ 位似变换 ≠ 图形偏移!

5. 多边形偏移的具体步骤

要对一个已知顶点的多边形进行偏移,可以按照以下步骤操作:

  1. 复制每个顶点
  2. 将复制后的顶点与前一个顶点连接成线段;
  3. **沿线段方向移动固定距离 $ \delta $**;
  4. 根据线段斜率计算偏移方向
  5. 连接偏移后的顶点并处理拐角

5.1 计算偏移方向

设线段 $ \overline{\rm AB} $ 的斜率为:

$$ m = \frac{y_B - y_A}{x_B - x_A} $$

与该线段垂直的直线的斜率为 $ -\frac{1}{m} $。

对于每个顶点偏移后的新坐标 $ (x_{new}, y_{new}) $,需满足:

$$ \frac{y_{new} - y_{old}}{x_{new} - x_{old}} = -\frac{1}{m} $$

$$ (y_{new}-y_{old})^2 + (x_{new}-x_{old})^2 = \delta^2 $$

这两个方程构成一个二元二次方程组,可以通过代数方法求解。

6. 连接偏移后的线段

偏移完成后,需要将相邻线段之间的空隙用圆弧填补。具体做法是:

  • 以原顶点为中心;
  • 以偏移距离 $ \delta $ 为半径;
  • 绘制一个夹在两个偏移线段之间的圆弧。

这个动画演示了整个膨胀过程:

MyScene 1

⚠️ 注意:对于凹多边形,需判断偏移后的点是否在原图形外部,否则需删除这些点。

✅ 该算法同样适用于收缩操作,只需将偏移方向取反(即 $ \delta $ 取负值)即可。

7. 总结

本文介绍了两种常见的多边形缩放方式:

  • 位似变换(Homothety):快速缩放,但不保证边缘等距;
  • 偏移变换(Offsetting):更复杂,但能保证边缘等距,适用于地理围栏、图形缓冲等场景。

两种方法各有优劣,选择时应根据具体需求判断。如果你需要精确控制图形边缘的距离,偏移是更合适的选择。


原始标题:An Algorithm for Inflating and Deflating Polygons