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

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

#include

#include

#include

#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;

}

c语言编程实现泰森多边形算法,Voronoi图简介及C语言实现相关推荐

  1. 泰森多边形(Voronoi图)的matlab绘制

    泰森多边形(Voronoi图)的matlab绘制 泰森多边形(Voronoi图)的matlab绘制 1.泰森多边形的介绍 2.算法实现 2.0 matlab自带函数算法 2.1 Delaunay三角算 ...

  2. 泰森多边形(Voronoi图)

    二维Delaunay(德洛内)三角网剖分的matlab实现 https://blog.csdn.net/weixin_42943114/article/details/82262122 泰森多边形(V ...

  3. 用c语言编写篮球过程运行结果,基于单片机的篮球计时计分器设计(c语言编程、含proteus仿真图) 本科毕业论文.doc...

    基于单片机的篮球计时计分器设计(c语言编程.含proteus仿真图) 本科毕业论文 摘要 单片机,亦称单片微电脑或单片微型计算机.它是把中央处理器(CPU).随机存取存储器(RAM).只读存储器(RO ...

  4. 切割优化模型可以用c语言编程不,数学算法对计算机编程优化研究

    数学算法是一种以数学模型为基础的理论知识,能够对计算机编程中的问题进行归纳总结和统一计算,以提高逻辑应用的效率,它是计算机编程的基础.计算机编程是从数学模型开始的,首先要根据具体问题进行抽象,以建立一 ...

  5. c语言编程题考试自动评分系统,C语言编程题考试自动评分系统简介.ppt

    C语言编程题考试自动评分系统简介 主要内容 教材简介 学习方法 机考系统简介 教材简介 教学理念的更新 教材简介 教材简介 国内55所院校使用 新版增加的内容 强化知识点.算法.编程方法与技巧 [编程 ...

  6. c语言编程实现dsa算法,椭圆曲线加密算法的C语言实现.doc

    椭圆曲线加密算法的C语言实现 毕业设计(论文) 题目: 椭圆曲线加密算法的C语言实现 院(系) 信息科学与工程学院 专 业 电子信息工程 届 别 07级 学 号 0715212026 姓 名 王正辉 ...

  7. 换硬币c语言编程_为什么大多数程序员都会学C语言的5大原因!什么原因让你学不会?...

    一.c语言,不朽的传奇 从30年前到如今,一些流行的科技媒体上发表的编程语言排行榜,c语言始终稳定位于前三位,这是其他一种其他的编程语言都达不到的.c语言的江湖地位,不容撼动.虽历史悠久,却也是不朽的 ...

  8. c语言编程物理实验,大学物理实验报告大全C语言编程在大学物理实验中处理数据的研究...

    大学物理实验报告大全C语言编程在大学物理实验中处理数据的研究 摘要 用C语言编程的方法处理比较复杂的实验数据,简捷准确且避免了传统方法的弊端,与用Excel处理数据的方法相比,其结果更符合误差理论. ...

  9. atmega16 c语言编程,ATmega16开发系统设计(附protel电路图和C语言程序)☆

    摘    要 本文所研究的单片机是Atmega16,这款单片机零售价低,货源充足:且具有16KB的Flash,能满足绝大部分的实际需要:它还支持JTAG仿真,特别适合AVR初学者和需要繁琐调试的低成本 ...

最新文章

  1. python打开指定文件-Python获取指定文件夹下的文件
  2. android生成大分辨率图片,自动生成Android不同分辨率下的图片
  3. 判断ShellExecute函数是否执行完一个程序的方法
  4. AI Studio 学习 Go 豆瓣电影爬取
  5. CORS跨域限制以及预请求验证(C++ Qt框架实现)
  6. Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结...
  7. 百度地图 android SDKv2.2.0
  8. azure mysql无法连接_java - 无法从Azure的JAVA功能连接到Azure的MySQL数据库 - SO中文参考 - www.soinside.com...
  9. 飞鸽传书2007绿色版该消息称
  10. Numpy中的向量运算
  11. amazon实例 更改密钥_如何更改Amazon Echo的警报声音
  12. 工程师为什么不转销售
  13. 深度剖析家用洗地机的方案设计
  14. Enow ICQ上的自白
  15. 品质网络的迭变之路,以及运营商的未来之匙
  16. 《Neo4j权威指南》简介,求伯君、周鸿袆、胡晓峰、周涛等大咖隆重推荐
  17. android 蓝牙搜索、配对连接通信总结
  18. 大数据职业规划所感所悟
  19. JSP+ssm计算机毕业设计服装销售进出货管理系统141r2【源码、数据库、LW、部署】
  20. PL/SQL 记录与集合

热门文章

  1. 【Github】玩转Github系列之三——史上最全Github加速手段
  2. Java连接Access 2013
  3. 分享一份完整内容高端企业项目成本管理培训PPT模板
  4. scp: /usr/local/tools//jdk-7u80-linux-x64.tar.gz: Permission denied
  5. Java基础——匿名内部类
  6. 机器学习 决策树篇——解决离散变量的分类问题
  7. access怎么查询工龄_计算机二级Access数据库查询的功能教程
  8. 大像素全景制作完成后,推广方式有哪些?
  9. 传播特性与频率的关系
  10. Linux下mysql5.7修改密码的坑