c语言编程实现泰森多边形算法,Voronoi图简介及C语言实现
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语言实现相关推荐
- 泰森多边形(Voronoi图)的matlab绘制
泰森多边形(Voronoi图)的matlab绘制 泰森多边形(Voronoi图)的matlab绘制 1.泰森多边形的介绍 2.算法实现 2.0 matlab自带函数算法 2.1 Delaunay三角算 ...
- 泰森多边形(Voronoi图)
二维Delaunay(德洛内)三角网剖分的matlab实现 https://blog.csdn.net/weixin_42943114/article/details/82262122 泰森多边形(V ...
- 用c语言编写篮球过程运行结果,基于单片机的篮球计时计分器设计(c语言编程、含proteus仿真图) 本科毕业论文.doc...
基于单片机的篮球计时计分器设计(c语言编程.含proteus仿真图) 本科毕业论文 摘要 单片机,亦称单片微电脑或单片微型计算机.它是把中央处理器(CPU).随机存取存储器(RAM).只读存储器(RO ...
- 切割优化模型可以用c语言编程不,数学算法对计算机编程优化研究
数学算法是一种以数学模型为基础的理论知识,能够对计算机编程中的问题进行归纳总结和统一计算,以提高逻辑应用的效率,它是计算机编程的基础.计算机编程是从数学模型开始的,首先要根据具体问题进行抽象,以建立一 ...
- c语言编程题考试自动评分系统,C语言编程题考试自动评分系统简介.ppt
C语言编程题考试自动评分系统简介 主要内容 教材简介 学习方法 机考系统简介 教材简介 教学理念的更新 教材简介 教材简介 国内55所院校使用 新版增加的内容 强化知识点.算法.编程方法与技巧 [编程 ...
- c语言编程实现dsa算法,椭圆曲线加密算法的C语言实现.doc
椭圆曲线加密算法的C语言实现 毕业设计(论文) 题目: 椭圆曲线加密算法的C语言实现 院(系) 信息科学与工程学院 专 业 电子信息工程 届 别 07级 学 号 0715212026 姓 名 王正辉 ...
- 换硬币c语言编程_为什么大多数程序员都会学C语言的5大原因!什么原因让你学不会?...
一.c语言,不朽的传奇 从30年前到如今,一些流行的科技媒体上发表的编程语言排行榜,c语言始终稳定位于前三位,这是其他一种其他的编程语言都达不到的.c语言的江湖地位,不容撼动.虽历史悠久,却也是不朽的 ...
- c语言编程物理实验,大学物理实验报告大全C语言编程在大学物理实验中处理数据的研究...
大学物理实验报告大全C语言编程在大学物理实验中处理数据的研究 摘要 用C语言编程的方法处理比较复杂的实验数据,简捷准确且避免了传统方法的弊端,与用Excel处理数据的方法相比,其结果更符合误差理论. ...
- atmega16 c语言编程,ATmega16开发系统设计(附protel电路图和C语言程序)☆
摘 要 本文所研究的单片机是Atmega16,这款单片机零售价低,货源充足:且具有16KB的Flash,能满足绝大部分的实际需要:它还支持JTAG仿真,特别适合AVR初学者和需要繁琐调试的低成本 ...
最新文章
- python打开指定文件-Python获取指定文件夹下的文件
- android生成大分辨率图片,自动生成Android不同分辨率下的图片
- 判断ShellExecute函数是否执行完一个程序的方法
- AI Studio 学习 Go 豆瓣电影爬取
- CORS跨域限制以及预请求验证(C++ Qt框架实现)
- Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结...
- 百度地图 android SDKv2.2.0
- azure mysql无法连接_java - 无法从Azure的JAVA功能连接到Azure的MySQL数据库 - SO中文参考 - www.soinside.com...
- 飞鸽传书2007绿色版该消息称
- Numpy中的向量运算
- amazon实例 更改密钥_如何更改Amazon Echo的警报声音
- 工程师为什么不转销售
- 深度剖析家用洗地机的方案设计
- Enow ICQ上的自白
- 品质网络的迭变之路,以及运营商的未来之匙
- 《Neo4j权威指南》简介,求伯君、周鸿袆、胡晓峰、周涛等大咖隆重推荐
- android 蓝牙搜索、配对连接通信总结
- 大数据职业规划所感所悟
- JSP+ssm计算机毕业设计服装销售进出货管理系统141r2【源码、数据库、LW、部署】
- PL/SQL 记录与集合
热门文章
- 【Github】玩转Github系列之三——史上最全Github加速手段
- Java连接Access 2013
- 分享一份完整内容高端企业项目成本管理培训PPT模板
- scp: /usr/local/tools//jdk-7u80-linux-x64.tar.gz: Permission denied
- Java基础——匿名内部类
- 机器学习 决策树篇——解决离散变量的分类问题
- access怎么查询工龄_计算机二级Access数据库查询的功能教程
- 大像素全景制作完成后,推广方式有哪些?
- 传播特性与频率的关系
- Linux下mysql5.7修改密码的坑