<think>我们使用MATLAB来生成一个简单的Voronoi图。步骤如下:
1. 生成一组随机点(称为站点)。
2. 使用`voronoi`函数绘制Voronoi图,或者使用`voronoin`函数获取Voronoi图的顶点和区域信息,然后手动绘制。
3. 可视化结果。
下面是一个简单的示例代码:
```matlab
% 生成随机点(站点)
rng('default'); % 设置随机种子,保证可重复性
points = rand(20, 2); % 生成20个二维随机点,范围在[0,1]之间
% 绘制Voronoi图
voronoi(points(:,1), points(:,2));
% 添加标题和标签
title('简单Voronoi图');
xlabel('X坐标');
ylabel('Y坐标');
grid on;
```
这段代码会生成一个包含20个随机点的Voronoi图。`voronoi`函数会自动计算并绘制。
### 进阶:手动控制绘图
如果我们想要更多的控制,比如填充每个Voronoi单元,可以使用`voronoin`函数获取每个单元的信息,然后使用`patch`函数进行填充。
```matlab
% 生成随机点
points = rand(20, 2);
% 计算Voronoi图的顶点和单元
[V, C] = voronoin(points);
% 创建一个新的图形
figure;
hold on;
% 绘制每个Voronoi单元
for i = 1:length(C)
vertices = V(C{i}, :); % 获取当前单元的所有顶点
if all(vertices(:,1) < inf) & all(vertices(:,2) < inf) % 只绘制有限区域
patch(vertices(:,1), vertices(:,2), rand(1,3)); % 用随机颜色填充
end
end
% 绘制原始点
plot(points(:,1), points(:,2), 'ko', 'MarkerFaceColor', 'k', 'MarkerSize', 4);
% 设置坐标轴范围
axis([0 1 0 1]);
title('填充颜色的Voronoi图');
xlabel('X坐标');
ylabel('Y坐标');
hold off;
```
### 说明
- `voronoi(x, y)`:直接绘制由点集`(x,y)`生成的Voronoi图。
- `voronoin`:返回Voronoi图的顶点`V`和单元`C`。`C`是一个元胞数组,每个元胞包含一个Voronoi单元对应的顶点索引。
- 由于Voronoi图在边界处会产生无限区域(顶点包含无穷远点),我们在绘制时通过条件`all(vertices(:,1) < inf) & all(vertices(:,2) < inf)`过滤掉这些无限区域。
### 数学基础
给定一组点(称为站点)$P = \{p_1, p_2, \dots, p_n\}$,其中$p_i \in \mathbb{R}^2$,则点$q$属于$p_i$的Voronoi单元当且仅当:
$$ \|q - p_i\| \leq \|q - p_j\|, \quad \forall j \neq i $$
即,该单元包含所有距离$p_i$最近的点。
### 应用
Voronoi图在多个领域有广泛应用,例如:
1. **地理信息系统**:划分服务区域(如邮局、医院)[^1]。
2. **计算机图形学**:生成自然纹理或破碎效果。
3. **机器人学**:路径规划中的区域划分。
§§相关问题§§
1. 如何在MATLAB中为Voronoi图添加边界约束(如矩形边界)?
2. Voronoi图在三维空间中如何用MATLAB绘制?
3. 如何计算Voronoi单元的面积?</think>在 MATLAB 中创建简单的 Voronoi 图非常简单直观。以下是详细步骤和代码实现:
### 基本实现方法
```matlab
% 1. 生成随机点集(种子点)
points = rand(20, 2); % 生成20个二维随机点,范围[0,1]
% 2. 绘制Voronoi图
voronoi(points(:,1), points(:,2)); % 绘制Voronoi图
hold on; % 保持当前图形
% 3. 添加种子点标记
plot(points(:,1), points(:,2), 'ro', 'MarkerFaceColor', 'r'); % 红色填充点
% 4. 添加标题和标签
title('简单Voronoi图');
xlabel('X坐标');
ylabel('Y坐标');
grid on;
axis equal; % 保持坐标轴比例一致
```
### 关键函数说明
1. `rand(n, 2)`:生成 n 个二维随机点,坐标范围 [0,1]
2. `voronoi(x, y)`:根据点集 (x,y) 绘制 Voronoi 图
3. `plot(x, y, 'ro')`:绘制红色圆点标记种子点位置
### 进阶功能:控制边界和样式
```matlab
% 生成点集(在指定范围内)
x = 10 * rand(30, 1); % X坐标范围[0,10]
y = 5 * rand(30, 1); % Y坐标范围[0,5]
% 绘制Voronoi图并设置样式
[vx, vy] = voronoi(x, y); % 获取Voronoi边界的顶点
plot(vx, vy, 'b-', 'LineWidth', 1.5); % 蓝色边界线
hold on;
plot(x, y, 'ko', 'MarkerFaceColor', 'g', 'MarkerSize', 8); % 绿色填充点
% 设置坐标轴范围和标题
axis([0 10 0 5]); % 设置坐标轴范围
title('带边界约束的Voronoi图');
xlabel('X');
ylabel('Y');
grid on;
```
### 数学原理
Voronoi 图将平面划分为多个区域,每个区域包含距离特定种子点最近的所有点。数学上定义为:
$$ V(p_i) = \{ x \in \mathbb{R}^2 \mid \|x - p_i\| \leq \|x - p_j\|, \forall j \neq i \} $$
其中 $p_i$ 是种子点集中的一个点[^1]。
### 应用场景
1. **地理分析**:划分服务区域(如消防站覆盖范围)
2. **无线网络**:基站信号覆盖区域划分
3. **生物建模**:模拟细胞生长模式
4. **数据可视化**:空间数据聚类展示