在计算机图形学、地理信息系统(GIS)、机器人路径规划等领域,Voronoi图算法是一种非常基础且强大的工具。本文将用通俗易懂的方式,手把手教你如何用C语言实现Voronoi图,即使你是编程新手,也能轻松上手!
Voronoi图(也叫泰森多边形)是一种将平面划分为多个区域的方法。给定一组点(称为“种子点”或“生成点”),每个区域包含所有离该区域内种子点最近的点。简单来说,就是“谁的地盘归谁管”。

Voronoi图是计算几何算法中的经典问题,掌握它不仅能提升你的算法思维,还能为后续学习Delaunay三角剖分、空间分析等打下基础。对于初学者来说,这也是理解“分治”和“距离比较”思想的好例子。
由于完整的Voronoi图构建(如Fortune算法)较为复杂,本文采用一种适合初学者Voronoi教程的暴力方法:遍历图像中的每个像素,计算它到所有种子点的距离,归属最近的种子点。
这种方法虽然效率不高,但逻辑清晰,非常适合教学目的。
下面是一个使用控制台输出简易Voronoi图的C程序:
#include <stdio.h>#include <math.h>#define WIDTH 80#define HEIGHT 25#define NUM_POINTS 5// 种子点结构typedef struct { int x, y;} Point;// 计算两点间欧氏距离的平方(避免开方提高效率)double dist_sq(int x1, int y1, int x2, int y2) { int dx = x1 - x2; int dy = y1 - y2; return dx * dx + dy * dy;}int main() { // 定义5个种子点(你可以修改这些坐标) Point seeds[NUM_POINTS] = { {10, 5}, {70, 8}, {40, 15}, {20, 20}, {60, 22} }; // 遍历屏幕上的每个“像素” for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { int closest = 0; double min_dist = dist_sq(x, y, seeds[0].x, seeds[0].y); // 找到最近的种子点 for (int i = 1; i < NUM_POINTS; i++) { double d = dist_sq(x, y, seeds[i].x, seeds[i].y); if (d < min_dist) { min_dist = d; closest = i; } } // 用不同字符表示不同区域 char symbols[] = {'*', '#', '@', '%', '&'}; putchar(symbols[closest]); } putchar('\n'); } return 0;}Point 存储每个种子点的坐标。dist_sq)避免浮点运算,提高效率。*, # 等)代表不同Voronoi区域。编译并运行上述代码,你将在终端看到一个由不同符号组成的Voronoi图。虽然粗糙,但它清晰展示了区域划分的概念。
如果你想进一步提升,可以:
通过这个简单的C语言程序,你已经掌握了Voronoi图算法的基本原理和实现方式。虽然这只是入门级实现,但它为你打开了计算几何算法的大门。坚持练习,你很快就能挑战更复杂的图形算法!
记住:每一个复杂的图形,都始于一个简单的点。
本文由主机测评网于2025-12-07发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025124473.html