在计算机图形学、地理信息系统(GIS)、机器人路径规划等领域,Voronoi图算法是一种非常重要的计算几何工具。本文将带你从零开始,用C++实现Voronoi图的生成过程,即使你是编程小白,也能轻松理解并动手实践!
Voronoi图(也称泰森多边形)是一种将平面划分为多个区域的方法。给定一组点(称为“站点”或“种子点”),每个区域包含所有离该区域内对应站点最近的点。换句话说,Voronoi图中的每一块区域都“属于”离它最近的那个原始点。

严格来说,高效生成Voronoi图需要使用Fortune算法(时间复杂度 O(n log n)),但对初学者而言,我们可以采用一种更直观的“暴力法”来理解其原理——即遍历图像中的每个像素,计算它到所有种子点的距离,然后分配给最近的种子点。
虽然这种方法效率较低(O(n × m),其中 n 是种子点数量,m 是像素数量),但它逻辑清晰,非常适合学习和可视化。
下面是一个使用标准C++(不依赖外部图形库)生成Voronoi图文本表示的简化版本。你可以将其扩展为使用OpenCV或SFML进行图形渲染。
#include <iostream>#include <vector>#include <cmath>#include <limits>struct Point { double x, y; Point(double x = 0, double y = 0) : x(x), y(y) {}};double distance(const Point& a, const Point& b) { return std::sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));}// 简化的Voronoi图生成(输出每个像素所属的站点索引)void generateVoronoi(const std::vector<Point>& sites, int width, int height) { for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { int closestSite = 0; double minDist = std::numeric_limits<double>::max(); for (size_t i = 0; i < sites.size(); ++i) { double d = distance(Point(x, y), sites[i]); if (d < minDist) { minDist = d; closestSite = static_cast<int>(i); } } // 这里可以将 closestSite 映射为颜色并绘图 // 为简化,我们只输出站点编号(模10) std::cout << (closestSite % 10); } std::cout << "\n"; }}int main() { std::vector<Point> seeds = { Point(10, 10), Point(50, 20), Point(30, 40), Point(60, 60) }; int width = 80; int height = 40; std::cout << "生成Voronoi图(文本表示):\n"; generateVoronoi(seeds, width, height); return 0;}上述暴力法适合教学,但在实际项目中,建议使用成熟的库:
通过本教程,你已经掌握了Voronoi图算法的基本概念,并用C++实现了其简化版本。虽然我们使用的是暴力方法,但它帮助你理解了Voronoi图的核心思想:**“就近归属”**。
下一步,你可以尝试:
无论你是学习计算几何,还是想在项目中应用Voronoi图生成技术,希望这篇教程为你打下了坚实的基础!
本文由主机测评网于2025-12-04发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123063.html