跳到内容

Voronoi 图

给定一组点,Voronoi 图将平面划分为单元格,表示平面中与相应点距离最近的区域。Voronoi 图是 Delaunay 三角剖分 的对偶图。

delaunay.voronoi(bounds)

源代码 · 返回给定 Delaunay 三角剖分 的 Voronoi 图。渲染时,该图将被裁剪到指定的 bounds = [xmin, ymin, xmax, ymax]。

js
const delaunay = d3.Delaunay.from([[0, 0], [0, 100], [100, 0], [100, 100]]);
const voronoi = delaunay.voronoi([0, 0, 640, 480]);

如果 bounds 未指定,则默认值为 [0, 0, 960, 500]。即使在不存在三角剖分的退化情况下,也会返回 Voronoi 图——即 0 个、1 个或 2 个点,以及共线点。

voronoi.delaunay

Voronoi 图关联的 Delaunay 三角剖分

voronoi.circumcenters

Delaunay 三角形的 外心,以 Float64Array [cx0, cy0, cx1, cy1, …] 的形式表示。每对连续的坐标 cx, cy 是对应三角形的外心。这些外心构成 Voronoi 单元多边形的坐标。

voronoi.vectors

一个 Float64Array [vx0, vy0, wx0, wy0, …],其中每个非零四元组描述外壳上的一个开放(无限)单元格,给出两个开放半线的方向。

voronoi.xmin
voronoi.ymin
voronoi.xmax
voronoi.ymax

用于渲染 Voronoi 图的视窗范围 [xmin, ymin, xmax, ymax]。这些值只影响渲染方法 (voronoi.rendervoronoi.renderBoundsvoronoi.renderCell)。

voronoi.contains(i, x, y)

源代码 · 如果具有指定索引 i 的单元格包含指定点 ⟨x, y⟩,则返回 true;即,点 i 是否是图中离指定点最近的点。(此方法不受关联的 Voronoi 图的视窗 范围 的影响。)

voronoi.neighbors(i)

js
voronoi.neighbors(-1) // []

源代码 · 返回一个可迭代对象,其中包含与指定单元格 i 共享一条边的单元格的索引。Voronoi 邻居总是 Delaunay 图上的邻居,但当公共边被 Voronoi 图的视窗裁剪掉时,反过来不成立。

voronoi.render(context)

源代码 · 将 Voronoi 单元格的网格渲染到指定的 context 中。指定的 context 必须实现来自 CanvasPathMethods APIcontext.moveTo 和 context.lineTo 方法。如果没有指定 context,则改为返回一个 SVG 路径字符串。

voronoi.renderBounds(context)

源代码 · 将视窗范围渲染到指定的 context 中。指定的 context 必须实现来自 CanvasPathMethods APIcontext.rect 方法。等同于 context.rect(voronoi.xmin, voronoi.ymin, voronoi.xmax - voronoi.xmin, voronoi.ymax - voronoi.ymin)。如果没有指定 context,则改为返回一个 SVG 路径字符串。

voronoi.renderCell(i, context)

源代码 · 将具有指定索引 i 的单元格渲染到指定的 context 中。指定的 context 必须实现来自 CanvasPathMethods APIcontext.moveTo、context.lineTo 和 context.closePath 方法。如果没有指定 context,则改为返回一个 SVG 路径字符串。

voronoi.cellPolygons()

源代码 · 返回一个可迭代对象,其中包含 每个单元格的多边形,其中包含单元格索引作为属性。另请参阅 voronoi.renderCell

voronoi.cellPolygon(i)

源代码 · 返回一个凸闭合多边形 [[x0, y0], [x1, y1], …, [x0, y0]],表示指定点 i 的单元格。另请参阅 voronoi.renderCell

voronoi.update()

源代码 · 在点在内存中被修改后更新 Voronoi 图和底层三角剖分——对 Lloyd 松弛很有用。在底层的 Delaunay 三角剖分上调用 delaunay.update