Voronoi图简介及C语言实现

Voronoi图广泛应用在几何学、地理学、晶体学、信息系统等学科之中。Voronoi图是由图中各个相邻点连线的中垂线组成的连续多边形组成。图中的各个点归属于该点最邻近的多边形,如下图所示:



Voronoi图相应的C语言实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define N_SITES 150
double site[N_SITES][2];
unsigned char rgb[N_SITES][3];
 
int size_x = 640, size_y = 480;
 
inline double sq2(double x, double y)//square function
{
	return x * x + y * y;
}
 
#define for_k for (k = 0; k < N_SITES; k++)//define for_k

int nearest_site(double x, double y) //get the nearest site id
{
	int k, ret = 0;
	double d, dist = 0;
	for_k {
		d = sq2(x - site[k][0], y - site[k][1]);
		if (!k || d < dist) { //get the nearest distance
			dist = d, ret = k;
		}
	}
	return ret;
}
 
/* see if a pixel is different from any neighboring ones */
int at_edge(int *color, int y, int x)
{
	int i, j, c = color[y * size_x + x];
	for (i = y - 1; i <= y + 1; i++) {
		if (i < 0 || i >= size_y) continue;
 
		for (j = x - 1; j <= x + 1; j++) {
			if (j < 0 || j >= size_x) continue;
			if (color[i * size_x + j] != c) return 1;
		}
	}
	return 0;
}
 
#define AA_RES 4 /* average over 4x4 supersampling grid */
void aa_color(unsigned char *pix, int y, int x) //get color for pix(x, y)
{
	int i, j, n;
	double r = 0, g = 0, b = 0, xx, yy;
	for (i = 0; i < AA_RES; i++) {
		yy = y + 1. / AA_RES * i + .5;
		for (j = 0; j < AA_RES; j++) {
			xx = x + 1. / AA_RES * j + .5;
			n = nearest_site(xx, yy);
			r += rgb[n][0];
			g += rgb[n][1];
			b += rgb[n][2];
		}
	}
	pix[0] = r / (AA_RES * AA_RES);
	pix[1] = g / (AA_RES * AA_RES);
	pix[2] = b / (AA_RES * AA_RES);
}
 
#define for_i for (i = 0; i < size_y; i++)
#define for_j for (j = 0; j < size_x; j++)
void gen_map()
{
	int i, j, k;
	int *nearest = malloc(sizeof(int) * size_y * size_x);
	unsigned char *ptr, *buf, color;
 
	ptr = buf = malloc(3 * size_x * size_y);
	for_i for_j nearest[i * size_x + j] = nearest_site(j, i);
 
	for_i for_j {
		if (!at_edge(nearest, i, j))
			memcpy(ptr, rgb[nearest[i * size_x + j]], 3);
		else	/* at edge, do anti-alias rastering */
			aa_color(ptr, i, j);
		ptr += 3;
	}
 
	/* draw sites */
	for (k = 0; k < N_SITES; k++) {
		color = (rgb[k][0]*.25 + rgb[k][1]*.6 + rgb[k][2]*.15 > 80) ? 0 : 255;
 
		for (i = site[k][1] - 1; i <= site[k][1] + 1; i++) {
			if (i < 0 || i >= size_y) continue;
 
			for (j = site[k][0] - 1; j <= site[k][0] + 1; j++) {
				if (j < 0 || j >= size_x) continue;
 
				ptr = buf + 3 * (i * size_x + j);
				ptr[0] = ptr[1] = ptr[2] = color;
			}
		}
	}
 
	printf("P6\n%d %d\n255\n", size_x, size_y);
	fflush(stdout);
	fwrite(buf, size_y * size_x * 3, 1, stdout);
}
 
#define frand(x) (rand() / (1. + RAND_MAX) * x)
int main()
{
	int k;
	for_k {
		site[k][0] = frand(size_x);
		site[k][1] = frand(size_y);
		rgb [k][0] = frand(256);
		rgb [k][1] = frand(256);
		rgb [k][2] = frand(256);
	}
 
	gen_map();
	return 0;
}



  • 16
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
Voronoi,也称为泰森多边形,是一种用于表示离散点之间空间分割的形方法。它将空间划分为多个区域,每个区域都由距离其最近的离散点控制。以下是关于如何实现Voronoi的简要步骤: 1. 收集离散点数据:首先,我们需要收集要生成Voronoi的离散点的数据。这些点可以是从一组坐标数据中提取的,或者是随机生成的。 2. 计算距离:对于每个点,我们需要计算其与所有其他点之间的距离。常用的距离计算方法有欧氏距离、曼哈顿距离等。可以使用数学公式或函数库来实现距离计算。 3. 确定最近点:对于每个点,找到距离最近的离散点。这可以通过比较每个点与其他所有点的距离来实现。这样,每个点将有一个最近的离散点。 4. 创建Voronoi区域:使用距离最近的离散点集合,我们可以根据这些点的位置来划分空间。将每个点作为中心,绘制出一个凸多边形,该多边形包含所有到达该点的路径比其他点更短的区域。这些凸多边形组成了Voronoi的边界。 5. 可视化:最后,我们可以使用形库将Voronoi可视化。根据需要,我们可以为每个区域填充不同的颜色,以区分不同的Voronoi区域。 通过上述步骤,我们可以实现Voronoi的生成。这种形方法在多个领域有广泛的应用,例如地理信息系统、计算机形学、物理模拟等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值