首页 > 其他分享 >Unity实现Voronoi图(性能友好,分布较为均匀

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

时间:2023-11-18 17:44:33浏览次数:38  
标签:gridSize imgSize int Vector2Int Voronoi Unity new pixelsPerCell 友好

 

这是一种性能友好的并且生成较为均匀的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;
            }
        }
    }
}

 

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

标签:gridSize,imgSize,int,Vector2Int,Voronoi,Unity,new,pixelsPerCell,友好
From: https://www.cnblogs.com/sanyejun/p/17840809.html

相关文章

  • Unity3D:ECS架构详解
    Unity3D是目前游戏开发领域最为流行的引擎之一,而Unity3DECS架构则是在Unity3D引擎的基础上,针对游戏开发中的实体组件系统进行优化和改进而设计的一种架构。本文将详细介绍Unity3DECS架构的技术细节和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开......
  • Unity之贴图混合
    有如下几种方式:1.CPU端逐像素根据alpha通道进行叠加1publicvoidMergeTexture(Texture2Dtt1,Texture2Dtt2,intoffsetX,intoffsetY)2{3Texture2DnewTex=newTexture2D(tt1.width,tt1.height,TextureFormat.ARGB32,false);4......
  • [Unity3D]检测鼠标点击角色移动
    学习工具Unity3D学习内容如何检测鼠标点击移动角色自己的理解原理:通过检测鼠标的光线投射(Raycast)是否与地面碰撞(RaycastHit),再检测鼠标左键(Input.GetMouseButton(0))是否点击,如果两个都符合则执行移动方法源代码如下:privateboolInteractWithMovement(){Raycas......
  • 【Unity UGUI】UGUI适配
    1/*=================================================2*FileName:SafeAreaPanel.cs3*Author:None4*UnityVersion:2021.3.20f15*Date:2023-07-2016:116*Description:UI适配组件7*History:8*---------......
  • unity 打包问题记录
     问题1: ErrorbuildingPlayerbecausescriptshadcompilererrors问题描述:在打包准备真机测试时发现了这个问题,到处查找解决办法后发现了问题,以下一些解决办法提供了思路。解决思路:(1)、关于AB打包出现的错误:ErrorbuildingPlayerbecausescriptshadcompilererrors的解......
  • Unity-观察者模式(observer)
    Unity-观察者模式(observer)引言​ 了解完委托(delegate)与事件(event)之后,我们来讨论一个问题。​ 假设我们有一个热水器,我们给他同上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你温度;2、液晶屏也会改变水温的显示,来提示水已经烧开了​ 现在我们需要写一个程序来模拟这个......
  • Unity-背包系统
    Unity-背包系统简介​ 背包是每个成功游戏中不可缺少的,玩家获取的装备与道具将会放入背包,需要时再拿出来使用。如果没有背包来储存玩家在游戏中获得的武器和道具,或许游戏将会变得十分单一枯燥,出招方式一成不变。​ 有了背包系统,玩家才可以使用不同的武器,搭配不同的道具,使出不同......
  • Unity-FSM有限状态机
    Unity-FSM有限状态机什么是有限状态机?​ 在编写一些需要判断多个条件的程序时,我们常常会用到if-else语句,这样能够很好的帮我们解决多数问题。但在游戏开发过程中,一个角色的行为不是一成不变的,需要实时的进行修改,此时如果我们使用的是if-else来判断角色所处状态,就需要修改整......
  • Unity-场景的异步加载
    Unity-场景的异步加载为什么需要异步加载​ 在诸多大型游戏里,场景渲染精度都是动态的,随着场景与角色距离的增加,渲染精度也在递减,这样极大的减少了硬件性能的消耗。​ 但如果角色使用了某些传送技能,将自己传送到为渲染的地点,游戏可能就会因为需要瞬间渲染大量的场景而卡顿。此时......
  • Unity-Menu&场景切换
    Unity-Menu&场景切换开始界面1.要创建开始界面,首先要新建一个场景,用于添加游戏开始界面的内容2.新建按钮步骤:UI>画板>Button(按钮)>根据需要设置按钮3.给按钮添加代码,使得按下按钮就可以进入下一关/退出游戏(1)代码内容需要用到usingUnityEngine.SceneManagement的头文件......