这是一种性能友好的并且生成较为均匀的Voronoi图的实现方式

在一张网格中生成随机点,然后在取每个点周围点就不需要去做全局遍历,在自己周围的格子遍历即可

using UnityEngine;
using UnityEngine.UI; public class VoronoiDiagram : MonoBehaviour
{
public int gridSize = 10;
private int imgSize;
private RawImage image;
private int pixelsPerCell;
private Vector2Int[,] pointsPositions;
private Color[,] colors; void Start()
{
image = GetComponent<RawImage>();
imgSize = Mathf.RoundToInt(image.GetComponent<RectTransform>().sizeDelta.x);
GnerateDiagram();
} void GnerateDiagram()
{
Texture2D texture = new Texture2D(imgSize, imgSize);
texture.filterMode = FilterMode.Point;
pixelsPerCell = imgSize / gridSize;
GeneratePoints(); for (int i = 0; i < imgSize; i++)
{
for (int j = 0; j < imgSize; j++)
{
int gridX = i / pixelsPerCell;
int gridY = j / pixelsPerCell; float nearestDistance = Mathf.Infinity;
Vector2Int nearestPoint = new Vector2Int(); // 取九宫格周围的点
for (int a = -1; a < 2; a++)
{
for (int b = -1; b < 2; b++)
{
int X = gridX + a;
int Y = gridY + b;
if (X < 0 || Y < 0 || X >= gridSize || Y >= gridSize)
{
continue;
} float distance = Vector2Int.Distance(new Vector2Int(i, j), pointsPositions[X, Y]);
if (distance < nearestDistance)
{
nearestDistance = distance;
nearestPoint = new Vector2Int(X, Y);
}
}
} texture.SetPixel(i, j, colors[nearestPoint.x, nearestPoint.y]);
}
} texture.Apply();
image.texture = texture;
} private void GeneratePoints()
{
pointsPositions = new Vector2Int[gridSize, gridSize];
colors = new Color[gridSize, gridSize];
for (int i = 0; i < gridSize; i++)
{
for (int j = 0; j < gridSize; j++)
{
pointsPositions[i, j] = new Vector2Int(i * pixelsPerCell + Random.Range(0, pixelsPerCell),
j * pixelsPerCell + Random.Range(0, pixelsPerCell)); float r = Random.Range(0, 1f);
float g = Random.Range(0, 1f);
float b = Random.Range(0, 1f);
Color c = new Color(r, g, b, 1);
colors[i, j] = c;
}
}
}
}

关键字:泰森多边形;沃洛诺伊图

口述:

分散的每个点分别代表一种颜色点

遍历图片的每个像素点,每个像素点查找与自己最近的是哪个颜色点就把当前像素点染成这个颜色

为了性能考虑我们划分了格子,所有只用查找自己周围的九宫格的点判断距离就行,不用和每个颜色点做距离比较

简单理解:假设一个格子里面有2个颜色点,遍历这个格子的每个像素,像素距离哪个颜色点近就染成什么颜色,最终会得到以2个颜色点的一个垂直平分线的颜色划分的2块颜色区域

Unity实现Voronoi图(性能友好,分布较为均匀的更多相关文章

  1. 渲染voronoi图

    渲染voronoi图要比计算voronoi图简单. 渲染voronoi图: 方法1: 在pixel shader里,对每一个像素,求哪个种子点到它的距离最近,将此种子点的颜色作为此像素颜色. 当种子点 ...

  2. Voronoi图及matlab实现

    [题外话:想一想真是...美赛时我预测求爱尔兰的充电站位置分布,画Voronoi图,程序跑了一个小时...]   Voronoi图,又叫泰森多边形或Dirichlet图,它是由一组由连接两邻点直线的垂 ...

  3. GDI与GDI+ 贴图性能对比

    在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了GDI , 与GDI+ 贴图性能. 这里假设在内存中已绘制完成一张图片,现需求显示在控件上,同时,总是更新全部区域. GDI+ 实现 priva ...

  4. 【VR视频播放】解决Unity模型贴图反转的问题

    使用UV贴图网模型上贴的时候, 会出现图片反过来的情况. 根本原因是因为, 一般系统的屏幕坐标系(例如Android)是左上角为原点(0,0), 但是Unity的贴图是以左下角为原点(0,0) 方法有 ...

  5. Voronoi图和Delaunay三角剖分

    刷题的时候发现了这么一个新的东西:Voronoi图和Delaunay三角剖分 发现这个东西可以$O(nlogn)$解决平面图最小生成树问题感觉非常棒 然后就去学了.. 看的n+e的blog,感谢n+e ...

  6. Arcgis做出voronoi图

    人类第一步,,,我需要给我目前的基站点数据划分voronoi,预期得到每个基站的服务范围 在地统计模块geostatistical analysis 下面的数据探索expore就有Voronoi图 将 ...

  7. 《图像处理实例》 之 Voronoi 图

    Voronoi 图的设计 以下的改进是http://www.imagepy.org/的作者原创,我只是对其理解之后改进和说明,欢迎大家使用这个小软件! 如有朋友需要源工程,请在评论处留邮箱! 说明:类 ...

  8. OpenCV生成点集的Delaunay剖分和Voronoi图

    实现内容: 设置一副图像大小为600*600.图像像素值全为0,为黑色. 在图像中Rect(100,100,400,400)的区域随机产生20个点.并画出. 产生这些点集的Delaunay剖分和Vor ...

  9. C++ 生成 voronoi 图 & C++生成泰森多边形图形

    1. 功能 生成voronoi图的一个类 2. 代码 VoronoiDiagramGenerator.h #pragma once //Microsoft Visual Studio 2015 Ent ...

  10. python绘制图的度分布柱状图, draw graph degree histogram with Python

    图的度数分布 import collections import matplotlib.pyplot as plt import networkx as nx G = nx.gnp_random_gr ...

随机推荐

  1. C# 14 新增功能一览,你觉得实用吗?

    前言 今天咱们一起来看看在 C# 14 中新增的几个功能特性,是否给我们日常编码带了来便利. 前提准备 要体验 C# 14 中的新增功能,你需要安装最新的 Visual Studio 2022 版本或 ...

  2. SVN之“解决SVN清理失败问题”

    解决SVN清理失败,显示乱码问题 更新SVN时,提示要清理,但是清理失败,此时什么也操作不了,以下就是解决方案. 情况如图: 解决方案一: 下载splite3 新建一个临时文件夹,使用英文名字,将解压 ...

  3. 仿EXCEL插件,智表ZCELL产品V2.2 版本发布,增加获取单元格类型、样式功能,优化键盘事件、数值千分位等功能

    详细请移步 智表(ZCELL)官网www.zcell.net 更新说明  这次更新主要应用户要求,增加获取单元格类型.样式功能,优化键盘事件.数值千分位等功能 ,欢迎大家体验使用. 本次版本更新内容如 ...

  4. Flex布局-margin 妙用技巧

    在 flex 布局 中, 通过对子项设置 margin-auto; 的方式去吃掉剩余空间, 这种小技巧在很多时候能极大简化我们的布局哦. 单元素水平垂直居中 如果父容器是 flex, 要实现元素水平垂 ...

  5. 一套基于 Bootstrap 和 .NET Blazor 的开源企业级组件库

    前言 今天大姚给大家分享一套基于 Bootstrap 和 .NET Blazor 的开源企业级组件库:Bootstrap Blazor. 项目介绍 BootstrapBlazor 是一套基于 Boot ...

  6. 深入理解微服务架构:银弹 or 焦油坑?

    极客时间:<从 0 开始学架构>:深入理解微服务架构:银弹 or 焦油坑? 微服务与 SOA 的关系 SOA和微服务的关系和区别,可分为以下几种典型的观点: 微服务是 SOA 的实现方式 ...

  7. 简单说说C#中委托的使用-01

    简单说说C#中委托的使用-01 前言 距离上次更新文章,已经过去...月了. 没更新文章的主要原因,主要是因为参加工作后,感觉思维没有上学那会活跃,写文章没有思绪.再就是上班的时候把精力用光了,下班后 ...

  8. Ubuntu 通过 docker 启动 mysql

    1.首先拉取MySQL的镜像 docker pull mysql 2.运行mysql容器 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASS ...

  9. [python] python抽象基类使用总结

    在Python中,抽象基类是一类特殊的类,它不能被实例化,主要用于作为基类被其他子类继承.抽象基类的核心作用是为一组相关的子类提供统一的蓝图或接口规范,明确规定子类必须实现的方法,从而增强代码的规范性 ...

  10. [CRCI2008-2009] CVJETICI

    [CRCI2008-2009] CVJETICI 观察图片及样例一: 注:下文中的被占领,指的是在这一个区间内,才有交叉开花的可能. 第一张小图发现 $2 \sim 3$ 被占领. 第二张小图发现 $ ...