这是一种性能友好的并且生成较为均匀的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. 【笔记】Python3|使用 PyVis 完成神经网络数据集的可视化

    文章目录 版本: 应用实例: 1 神经网络可视化 2 别人的示例和代码 PyVis的应用: 零.官方教程 一.初始化画布`Network` 二.添加结点 添加单个结点`add_node`: 添加一系列 ...

  2. Nacos源码—4.Nacos集群高可用分析二

    大纲 6.CAP原则与Raft协议 7.Nacos实现的Raft协议是如何写入数据的 8.Nacos实现的Raft协议是如何选举Leader节点的 9.Nacos实现的Raft协议是如何同步数据的 1 ...

  3. Linux的API

    一.常用命令 1.Linux命令之剪切 mv 目标文件 目的文件 2.Linux之新增文件夹 mkdir 路径+文件名 3.Linux之删除命令 rm 删除文件 rmdir 删除文件夹        

  4. Helm课程资料

      第一章.helm介绍.组件.安装和目录结构 1.helm3课程简介 helm3课程简介第一章.helm介绍.组件.安装和目录结构第二章.编写一个chart和helm内置对象详解第三章.helm3常 ...

  5. 在CentOS 7虚拟机上正确安装Redis

    在CentOS 7虚拟机上正确安装Redis,可以按照以下步骤进行操作: 更新系统软件包:sudo yum update 安装Redis依赖库:sudo yum install epel-releas ...

  6. SgLang代码细读-2.forward过程

    SgLang代码细读-2.forward过程 总览 Forward的主要过程围绕着 run_batch->TPModelWorker->ModelRunner->Model-> ...

  7. elasticsearch RestHighLevelClient 关于document的常用操作 ---------- 新增篇

    es中的新增操作分类两大类:普通新增和批量新增 普通新增使用IndexRequest即可 批量新增使用BulkRequest通过循环的方式将数据进行统一装载最后执行bulk操作 普通新增: //es单 ...

  8. mysql安全小结

    sql的注入是一个很困扰人的问题,一些恶意攻击者可以利用sql注入来获取甚至是修改数据库中的信息,尤其是一些比较敏感的密码一类的数据. sql注入主要利用mysql 的注释将后续应正常执行的语句注释掉 ...

  9. python基础—初识函数(一)

    1.python中函数定义 函数是逻辑结构化和过程结构化的一种编程方法. (1).python中函数定义方法: def test(x): '''The function definitions''' ...

  10. ChatMoney是你创业自由副业的plan B!

    本文由 ChatMoney团队出品 人生永远要有Plan B,在当下的市场经济环境中,工作收入和日常支出完全不能平衡,导致生活质量越来越不理想.如果觉得实在撑不下去,也许可以换个思路.我在工作之余,也 ...