Unity实现Voronoi图(性能友好,分布较为均匀

这是一种性能友好的并且生成较为均匀的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图(性能友好,分布较为均匀的更多相关文章
- 渲染voronoi图
渲染voronoi图要比计算voronoi图简单. 渲染voronoi图: 方法1: 在pixel shader里,对每一个像素,求哪个种子点到它的距离最近,将此种子点的颜色作为此像素颜色. 当种子点 ...
- Voronoi图及matlab实现
[题外话:想一想真是...美赛时我预测求爱尔兰的充电站位置分布,画Voronoi图,程序跑了一个小时...] Voronoi图,又叫泰森多边形或Dirichlet图,它是由一组由连接两邻点直线的垂 ...
- GDI与GDI+ 贴图性能对比
在做绘图相关工作,由于对显示绘制结果实时性有要求,筛选了GDI , 与GDI+ 贴图性能. 这里假设在内存中已绘制完成一张图片,现需求显示在控件上,同时,总是更新全部区域. GDI+ 实现 priva ...
- 【VR视频播放】解决Unity模型贴图反转的问题
使用UV贴图网模型上贴的时候, 会出现图片反过来的情况. 根本原因是因为, 一般系统的屏幕坐标系(例如Android)是左上角为原点(0,0), 但是Unity的贴图是以左下角为原点(0,0) 方法有 ...
- Voronoi图和Delaunay三角剖分
刷题的时候发现了这么一个新的东西:Voronoi图和Delaunay三角剖分 发现这个东西可以$O(nlogn)$解决平面图最小生成树问题感觉非常棒 然后就去学了.. 看的n+e的blog,感谢n+e ...
- Arcgis做出voronoi图
人类第一步,,,我需要给我目前的基站点数据划分voronoi,预期得到每个基站的服务范围 在地统计模块geostatistical analysis 下面的数据探索expore就有Voronoi图 将 ...
- 《图像处理实例》 之 Voronoi 图
Voronoi 图的设计 以下的改进是http://www.imagepy.org/的作者原创,我只是对其理解之后改进和说明,欢迎大家使用这个小软件! 如有朋友需要源工程,请在评论处留邮箱! 说明:类 ...
- OpenCV生成点集的Delaunay剖分和Voronoi图
实现内容: 设置一副图像大小为600*600.图像像素值全为0,为黑色. 在图像中Rect(100,100,400,400)的区域随机产生20个点.并画出. 产生这些点集的Delaunay剖分和Vor ...
- C++ 生成 voronoi 图 & C++生成泰森多边形图形
1. 功能 生成voronoi图的一个类 2. 代码 VoronoiDiagramGenerator.h #pragma once //Microsoft Visual Studio 2015 Ent ...
- python绘制图的度分布柱状图, draw graph degree histogram with Python
图的度数分布 import collections import matplotlib.pyplot as plt import networkx as nx G = nx.gnp_random_gr ...
随机推荐
- 初见 cmake
初见 cmake cmake 是自动生成构建系统的一个工具.cmake 本身不是构建系统,它是一个生成构建系统的工具.或者说 cmake 不是一个构建工具,是一个能根据平台生成对应平台构建系统配置的构 ...
- 【记录】IDA和Ollydbg查看指令地址及地址对应的指令
文章目录 在IDA中查看指令地址 在Ollydbg中查看指令地址 在Ollydbg中查看地址对应的指令 在IDA中查看指令地址 在Ollydbg中查看指令地址 ollydbg在对应指令处,右键-查看- ...
- 【笔记】Python3|使用 PyVis 完成神经网络数据集的可视化
文章目录 版本: 应用实例: 1 神经网络可视化 2 别人的示例和代码 PyVis的应用: 零.官方教程 一.初始化画布`Network` 二.添加结点 添加单个结点`add_node`: 添加一系列 ...
- B1006 换个格式输出整数
让我们用字母 B 来表示"百".字母 S 表示"十",用 12-n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数.例如 ...
- SharpIco:用纯C#打造零依赖的.ico图标生成器,支持.NET9与AOT编译
前言 最近一直在完善我今年的两款桌面软件:视频剪辑工具 Clipify 和 AI 文章创作工具 StarBlogPublisher 虽然界面是基本完善了,但图标还是默认的,显得很不专业 于是我打算给这 ...
- maven导入org.apache.pdfbox
PDF和图片相互转换用到的maven依赖如下: <dependency> <groupId>org.apache.pdfbox</groupId> <arti ...
- 初探CAP定理及其不可兼得性
一.对CAP定理的理解 CAP定理是分布式系统设计的核心理论.由Eric Brewer在2000年提出,后由Gilbert和Lynch在2002年严格证明.分别是指Consistency一致性,Aav ...
- 阿里微服务解决方案-Alibaba Cloud之服务提供方搭建(二)
一.新建服务提供方模块 1.1 右键父工程 New-> Module 1.2 选择 Maven项目,然后 Next 1.3 指定父工程,并且子模块以端口号结尾,方便调试 1.4 因为父工程已经添 ...
- 6月23日直播预告丨如何自定义Flink LookupTable
数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实 ...
- 四、设备修改开机logo
2.1.修改开机logo 图片文件路径 (替换以下文件): ./kernel/logo.bmp ./kernel/logo_kernel.bmp 设备树配置路径(配置为开启显示logo): ./boo ...