Unity 随机生成道路-最小生成树
要使用Prim算法来确保生成的 Cube 之间不会有孤岛,你需要按照以下步骤进行实现:
1. 创建一个数据结构来表示 Cube,包括位置信息和是否已经被连接的状态。
2. 初始化一个空列表(或优先队列)来存储已连接的 Cube。
3. 随机选择一个 Cube 作为起始点,将其添加到已连接列表中。
4. 重复以下步骤,直到已连接列表中包含所有的 Cube:
a. 在已连接列表中选择一个 Cube(A)和一个未连接的 Cube(B),使得连接 A 和 B 的距离最短。
b. 将 Cube B 添加到已连接列表中,同时绘制连接线。
5. 所有 Cube 都被连接后,算法结束。
下面是一个使用Prim算法的示例代码:
这个示例代码使用Prim算法确保了生成的 Cube 之间不会有孤岛,所有 Cube 都会被连接起来。在 `ConnectCubes` 方法中,算法会遍历连接的 Cube 和未连接的 Cube,找到距离最近的未连接的 Cube,然后将它们连接起来。一旦所有 Cube 都被连接,算法结束。
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class CubeGenerator : MonoBehaviour
{
public GameObject cubePrefab; // 你的Cube预制体
public int numCubes = 5;
public float range = 100f; private List<Transform> cubes = new List<Transform>();
private List<Transform> connectedCubes = new List<Transform>(); void Start()
{
GenerateCubes();
ConnectCubes();
} void GenerateCubes()
{
for (int i = 0; i < numCubes; i++)
{
Vector3 randomPosition = new Vector3(Random.Range(-range, range), 0, Random.Range(-range, range));
GameObject cube = Instantiate(cubePrefab, randomPosition, Quaternion.identity);
cubes.Add(cube.transform);
}
} void ConnectCubes()
{
if (cubes.Count == 0)
return; connectedCubes.Add(cubes[0]);
// connectedCubes的数量会逐渐递增
while (connectedCubes.Count < cubes.Count)
{
Transform closestCube = null;
Transform currentCube = null;
float shortestDistance = float.MaxValue; //重置 shortestDistance,为了在后面的双重循环里面获取最短距离的点
//此函数确保了,每个连进来的点都是与已经连接的点是最小的距离那个
foreach (Transform connected in connectedCubes)
{
// 遍历连接的,在非连接的里面去找距离自己最短的那个
foreach (Transform unconnected in cubes)
{
if (!connectedCubes.Contains(unconnected))
{
float distance = Vector3.Distance(connected.position, unconnected.position);
if (distance < shortestDistance)
{
shortestDistance = distance;
closestCube = unconnected;
currentCube = connected;
}
}
}
} if (closestCube != null)
{
//添加连接点
connectedCubes.Add(closestCube);
Debug.DrawLine(currentCube.position, closestCube.position, Color.black, 1000);
}
}
} private void OnDrawGizmos()
{
Gizmos.color = Color.red; foreach (Transform cube in cubes)
{
Gizmos.DrawWireSphere(cube.position, 1.0f);
}
}
}
口述
一堆散乱的点
1.先随机找一个点,作为连接点A
2.找到和当前连接点A 最近的点B 进行连接
3.找和B最近的点C,因为此时已经连接点有A和B,所以C需要做判断和所有已经连接的点哪个近就和哪个连
4.找和C最近的D,重复上面的步骤,直到所有的点全部连完
Unity 随机生成道路-最小生成树的更多相关文章
- Unity 随机地图房间通道生成
之前的博客中已经说了随机房间生成: https://www.cnblogs.com/koshio0219/p/12604383.html 但实现房间生成只是整个地图生成最初最简单的一步.下面讨论如何随 ...
- roguelike地图的随机生成算法
如果要想自己设计一个roguelike游戏,那么需要你有一个随机地图生成,我在indienova上看到一篇文章,描述了一个roguelike算法,然后自己用unity实现了一个下. 原文地址:随机生成 ...
- Unity之生成扫描二维码
Unity之生成扫描二维码 Unity之生成扫描二维码 前言 开篇 Unity版本及使用插件 正题 前期准备 首先生成二维码 然后需要扫描二维码 该使用了 挂载脚本绑定按钮和输入框 运行内容 生成二维 ...
- 随机生成长度为len的密码,且包括大写、小写英文字母和数字
一道华三面试题,随机生成长度为len的密码,且包括大写.小写英文字母和数字,主要Random类的使用,random.nextInt(len)表示生成[0,len)整数.具体实现见下面代码,已经很详细了 ...
- Java随机生成18位身份证号
package com.ihome.data; import java.text.SimpleDateFormat; import java.util.Calendar; import java.ut ...
- js 随机生成姓名、手机号、身份证号、银行卡号
开发测试的时候,经常需要填写姓名.手机号.身份证号.银行卡号,既要符合格式要求.又不能重复.大家会到网上搜各种生成器.能不能自己写一个简单的生成器呢.下面是随机生成姓名.手机号.身份证号.银行卡号的j ...
- php随机生成验证码代码
<?php session_start(); //产生一个随机的字符串验证码 $checkcode=""; for ($i=0;$i<4;$i++){ $checkco ...
- python 随机生成固定长度的字串
from random import Random#随机生成4到20位的用户名def random_username(): username = '' chars = 'AaBbCcDdEeFfGgH ...
- [BCB] C++ BUILDER 绘图 随机生成图形
由于老师要求要实现一个填充算法,而每次填充都需要一个源图形[不规则],用mspaint自己画太麻烦,于是打算自己动手随机生成. 这里用的是 Polygen()函数,但是注意首尾相接,另外,为了保证规则 ...
- js随机生成N位数
function RondomPass(number){ var arr = new Array; "); ;i<number;i++){ ); arr[i] =arr1[n] ; / ...
随机推荐
- 【记录】IDA|IDA怎么查看当前二进制文件自动分析出来的内存分布情况(内存范围和读写性)
IDA版本:7.6 背景:我之前一直是直接看Text View里面的地址的首尾地址来判断内存分布情况的,似乎是有点不准确,然后才想到IDA肯定自带查看内存分布情况的功能,而且很简单. 文章目录 1 查 ...
- 操作系统:详解socket的接口实现
上节了解了套接字的工作机制和数据结构,但套接字有哪些基本接口实现呢? 套接字接口 套接字接口最初是 BSD 操作系统的一部分,在应用层与 TCP/IP 协议栈之间接供了一套标准的独立于协议的接口. L ...
- JavaScript入门笔记day1
文章目录 啥是JavaScript JavaScript与HTML的结合方式 js文件在HTML中的位置 注释方式 变量 命名规范: 定义的关键字 To be a struggling Rick fo ...
- uni-app项目从0-1基础架构搭建全流程
前情 最近新接了一个全新项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,UI库选择的是uview-plus,CSS引入现在流行的tainlwindcss,实现CSS原子化书写,实 ...
- XXL-MQ v1.4.0 | 轻量级分布式消息队列
Release Notes 1.[重构]XXL-MQ 核心代码重构,基于"存算分离"与"分区机制"设计思想.在轻量级.分布式的基础上,强化高吞吐.海量消息及水平 ...
- CV中常用Backbone-3:Clip/SAM原理以及代码操作
前面已经介绍了简单的视觉编码器,这里主要介绍多模态中使用比较多的两种backbone:1.Clip:2.SAM.对于这两个backbone简单介绍基本原理,主要是讨论使用这个backbone. 1.C ...
- odoo备份数据库无法还原问题解决:Command 'pg_dump' not found.
背景景:ubuntu20.04 上用命令安装postgresql后,odoo备份数据库报如下错误 安装命令:sudo apt-get install postgresql 默认安装:14版本的pg 错 ...
- 启智树提高组day4T3 T3(t3.cpp,1s,512MB)
启智树提高组day4T3 T3(t3.cpp,1s,512MB) 题面描述 输入格式 输出格式 样例输入 样例输出 数据范围 题解 task1 暴力dfs 10分 Code 1 #include< ...
- 钓鱼攻击(phishing)详解和实现过程
钓鱼攻击 定义:钓鱼攻击是一种常见的网络攻击手段,攻击者通过伪装成合法的网站.邮件或信息,诱骗用户提供敏感信息,如用户名.密码.银行卡号等,从而达到非法获取用户数据或进行欺诈的目的. 网络钓鱼(phi ...
- Springboot笔记<3> 组件注入注解@Conditional与@import
@Conditional @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. 创建ConfigConditional类和测试类Conf ...