要使用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 随机生成道路-最小生成树的更多相关文章

  1. Unity 随机地图房间通道生成

    之前的博客中已经说了随机房间生成: https://www.cnblogs.com/koshio0219/p/12604383.html 但实现房间生成只是整个地图生成最初最简单的一步.下面讨论如何随 ...

  2. roguelike地图的随机生成算法

    如果要想自己设计一个roguelike游戏,那么需要你有一个随机地图生成,我在indienova上看到一篇文章,描述了一个roguelike算法,然后自己用unity实现了一个下. 原文地址:随机生成 ...

  3. Unity之生成扫描二维码

    Unity之生成扫描二维码 Unity之生成扫描二维码 前言 开篇 Unity版本及使用插件 正题 前期准备 首先生成二维码 然后需要扫描二维码 该使用了 挂载脚本绑定按钮和输入框 运行内容 生成二维 ...

  4. 随机生成长度为len的密码,且包括大写、小写英文字母和数字

    一道华三面试题,随机生成长度为len的密码,且包括大写.小写英文字母和数字,主要Random类的使用,random.nextInt(len)表示生成[0,len)整数.具体实现见下面代码,已经很详细了 ...

  5. Java随机生成18位身份证号

    package com.ihome.data; import java.text.SimpleDateFormat; import java.util.Calendar; import java.ut ...

  6. js 随机生成姓名、手机号、身份证号、银行卡号

    开发测试的时候,经常需要填写姓名.手机号.身份证号.银行卡号,既要符合格式要求.又不能重复.大家会到网上搜各种生成器.能不能自己写一个简单的生成器呢.下面是随机生成姓名.手机号.身份证号.银行卡号的j ...

  7. php随机生成验证码代码

    <?php session_start(); //产生一个随机的字符串验证码 $checkcode=""; for ($i=0;$i<4;$i++){ $checkco ...

  8. python 随机生成固定长度的字串

    from random import Random#随机生成4到20位的用户名def random_username(): username = '' chars = 'AaBbCcDdEeFfGgH ...

  9. [BCB] C++ BUILDER 绘图 随机生成图形

    由于老师要求要实现一个填充算法,而每次填充都需要一个源图形[不规则],用mspaint自己画太麻烦,于是打算自己动手随机生成. 这里用的是 Polygen()函数,但是注意首尾相接,另外,为了保证规则 ...

  10. js随机生成N位数

    function RondomPass(number){ var arr = new Array; "); ;i<number;i++){ ); arr[i] =arr1[n] ; / ...

随机推荐

  1. 【笔记】PyVis|神经网络数据集的可视化

    文章目录 版本: 应用实例: PyVis的应用: 零.官方教程 一.初始化画布`Network` 二.添加结点 添加单个结点`add_node`: 添加一系列结点`add_nodes`: 三.添加边 ...

  2. FunProxy - 使用 Rust 构建跨平台全链路测试抓包代理工具

    作者:vivo 互联网大前端团队- Song Jiachao 在软件开发过程中,软件测试对于保障软件质量和用户满意度起着关键作用.为最大程度上提升软件品质,我们积极开展全链路测试实践,打造了用Rust ...

  3. C++ condition_variable 条件变量

    本节来了解下C++11 中关于条件变量(condition_variable) 的相关知识,这一部分的内容相信网上已经有了很多的分享,这里仅是对该部分内容学习的记录.总结. 条件变量(conditio ...

  4. Django批量创建Model实例

    1.前言: 将测试数据全部敲入数据库非常繁琐,而且如果与合作伙伴一起开发,部署,那么他们肯定也不想把时间花在一个一个录入数据的繁琐过程中,这时候,创建一个批量录入数据的脚本(population sc ...

  5. C#网络编程(六)----Socket编程模型

    简介 Socket(套接字)是计算机网络中的一套编程接口,是网络编程的核心,它将复杂的网络协议封装为简单的API,是应用层(HTTP)与传输层(TCP)之间的桥梁. 应用程序通过调用Socket AP ...

  6. .Net 组件库先混淆签名,再打包成.nupkg包

    目前,我们项目组打算做增量升级的功能,这涉及到dll库增量改变,只有修改过代码的dll才需要有文件的变化,否则文件和对应的版本是不会改变的. 我们之前的打包的项目有一个小缺陷: 在整个应用打包输出的时 ...

  7. JVM垃圾回收机制常见算法

       在探讨Java垃圾回收机制之前,我们首先应该记住一个单词:Stop-the-World.Stop-the-world意味着 JVM由于要执行GC而停止了应用程序的执行,并且这种情形会在任何一种G ...

  8. uniCloud云函数结合nodemailer发送邮件的方法

    使用uniCloud云函数结合nodemailer发送邮件的时候,在本地调试可以发送成功,但是当我把云函数上传后,就不能发送到邮件了,但是云函数依旧执行了.开始我以为是node.js版本的原因,但是经 ...

  9. C# 将 CSV 转化为 Excel

    引言 在数据处理和交换的过程中,CSV(逗号分隔值)格式和 Excel 文件格式都是非常常见的.CSV 文件以纯文本形式存储表格数据,易于生成和处理:而 Excel 文件则提供了更丰富的功能,如数据可 ...

  10. 技术干货|如何利用 ChunJun 实现数据实时同步?

    实时同步是 ChunJun 的⼀个重要特性,指在数据同步过程中,数据源与⽬标系统之间的数据传输和更新⼏乎在同⼀时间进⾏. 在实时同步场景中我们更加关注源端,当源系统中的数据发⽣变化时,这些变化会⽴即传 ...