使用matlab实现指定三维区域随机生成N个不相交球的函数

2023-05-16

自从写了这篇博客之后,更多的人来问我这个问题了。

简单写一个随机在一个三维区域生成球的matlab函数_风一样的航哥的博客-CSDN博客_comsol随机生成球体

上次简单写的功能,可以实现一些比较稀疏的分布,当分布比较密集的时候,会存在计算时间过长的问题,针对这个情况,本文做了更新。感谢粉丝的讨论和交流,让实现能够不断优化。

实现思路:1.随机生成,要用到随机数生成函数,matlab有好几种,这里实现使用了rand和randi函数,不同的是一个实现的是double类型,一个生成的是int类型的值。

2.位置随机,当然就采用了球心坐标是随机数,随机数在给定区间之内。

3.不相交,既然要不相交,那么任意两个球的距离都要大于球的直径,所以每次生成一个点之后,都要判断所有的距离是否满足条件,如果满足就加入到球心坐标数组中,不满足就下一次迭代。

4.如何画球体呢,本人使用了surf函数,surf(X,Y,Z) 创建一个三维曲面图,它是一个具有实色边和实色面的三维曲面。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度。曲面的颜色根据 Z 指定的高度而变化。

下面是具体代码部分:

function  PlotNsphere_in_cubeRect(X1,Y1,Z1,X2,Y2,Z2,N,R)
%plotNcircle_in_rect(X1,X2,Z1,Y1,Y2,Z2,N,R) 函数说明:生成随机N个互不相交的球体
%  参数说明:三维区域为(X1,Y1,Z1)->(X2,Y2,Z2)
%  N:表示N个球体,R表示球体半径
%  输出是一张plot绘制的图,
close all
MAXIRTER = 10000; % 最大迭代次数
i=1;
s=[];%矩阵s,第一行存储x,第二行存储y,第三行存储z
c=1; %控制循环次数
rng('shuffle')          %%每次随机种子不一样,防止每次结果都是一样的
while c<MAXIRTER
    %% 如果采用以下三行代码,那么生成的随机数为整数
    tempx=randi([int32(X1),int32(X2)],1);
    tempy=randi([int32(Y1),int32(Y2)],1);
    tempz=randi([int32(Z1),int32(Z2)],1);
    %% 如果采用以下三行代码,那么生成的随机数为double类型,也即是默认的取值
%     tempx=X1+(X2-X1)*rand();
%     tempy=Y1+(Y2-Y1)*rand();
%     tempz=Z1+(Z2-Z1)*rand()
    %如果矩阵s为空矩阵,则存储第一个随机数值
    if(isempty(s)==1)
        s(1,i)=tempx;
        s(2,i)=tempy;
        s(3,i)=tempz;
        i=i+1;
        c=c+1;
    end
    %如果矩阵s不为空矩阵,求出各个坐标之间的距离矩阵disl,将与所有点之间距离都大于10的坐标存储
    if(isempty(s)==0)
        for j=1:i-1
            disl(1,j)=sqrt(((tempx-s(1,j))^2)+((tempy-s(2,j))^2)+((tempz-s(3,j))^2));
            j=j+1;
        end
        if(isempty(find(disl<2*R,1))==1)  % 或size(find(l<n),1)==0 表示矩阵l中小于n的个数等于0
            s(1,i)=tempx;
            s(2,i)=tempy;
            s(3,i)=tempz;
            i=i+1; 
        end
        c=c+1;
    end
    if(i>=N+1)
        break;
    end
end
X=s(1,:);
Y=s(2,:);
Z=s(3,:);

%% 绘制球体
    figure
for i=1:1:N
    myplotsphere(X(i),Y(i),Z(i),R);
    hold on 
    axis equal
    grid on
end
end

%% 绘制球体的子函数
function myplotsphere(X,Y,Z,R)
% myplotsphere使用三点和半径进行绘制一个球体
%   x,y,z;三维坐标;R:半径
[x,y,z]=sphere;
surf(R*x+X,R*y+Y,R*z+Z)
% mesh(R*x+X,R*y+Y,R*z+Z)
hold on
% axis equal
end

具体函数实现中,有注释,应该能看得懂。

实例:

当运行命令PlotNsphere_in_cubeRect(0,0,0,50+3.77,50+3.77,20+2,680,1.65)之后,等待一段时间会输出一图:

当运行PlotNsphere_in_cubeRect(0,0,0,50+3,50+3,20+2,1000,1.2),也就是要生成1000个球体,会有结果:

 

 上述球体有点多,凑合看哈,最大测试就是1000啦,再大没有测试。

最后谢谢关注,如果问题,请私信或者留言。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用matlab实现指定三维区域随机生成N个不相交球的函数 的相关文章

  • webpack One CLI for webpack must be installed. These are recommended choices, delivered as separate

    场景 安装webpack的时候 遇到的情况 直接按照提示安装 提示Module webpack cli 不存在 One CLI for webpack must be installed These are recommended choi
  • 使用巨控GRM530模块远程通信连接TIA WINCC(异地组网)SIMATIC NET与S7-200 SMART 集成以太网口OPC 通信

    使用巨控GRM530模块远程通信连接TIA WINCC xff08 异地组网 xff09 SIMATIC NET与S7 200 SMART 集成以太网口OPC 通信 硬件 xff1a S7 200 SMART SR40PC 机 集成以太网卡
  • 01_使用cMake编译目标文件与库文件

    1 将单个源文件构建为可执行文件 1 1 准备工作 假设有以下源代码 xff0c 希望使用cMake将其构建为一个可执行文件 示例源码如下 span class token macro property span class token d
  • ROS image_transport及cv_bridge

    ROS image transport 压缩 此外上面提到过FPS这个参数 xff0c 自然少不了介绍图像的压缩 一般使用的时候直接会使用没有压缩的图像 xff0c 但是在需要传输的时候 xff0c 这一些大图像非常占用带宽 xff0c 所
  • NEMA格式

    NMEA標準格式 大部份的GPS receiver都具被有美國國家海洋電子學會 National Marine Electronics Association xff0c NMEA 所制定的標準規格 xff0c 其制定了所有航海電子儀器間的
  • 在 JETSON 上配置 CAN 总线收发并基于Node.js编写应用DEMO

    概述 CAN 总线 是汽车电子行业常用的通信协议 Nvidia 推出的边缘 AI 推理设备 JETSON TX2 AGX Xavier 两款开发板支持 CAN 总线通信 这里以 AGX Xavier 开发者套件 为例 介绍如何配置实现基本的
  • C++开发UDP通信:使用socket创建UDP服务器端和客户端

    我的主页视频讲解 博客不经常在线 xff0c 私信请到西瓜视频搜索 智能之心 xff0c 以智能之心赴智能之梦 UDP通信步骤 引用UDP通信步骤 一 UDP套接字服务端架构步骤 1 xff0e 初始化套接字环境WSAStartup 2 x
  • D6 PRO充电器使用方法

    充电方式两种 xff1a 接220V供电 xff08 推荐 xff09 接XT60电池供电 接线 xff1a 大头XT60接口平衡头6S 4S 3S 2S接口 xff0c 123456 黑线从右侧减号一侧开始接 xff0c 红线在左侧数字一
  • uORB和MAVLink通讯例程

    uORB uORB 是一种异步 publish subscribe 的消息传递 API xff0c 用于进程或者线程间通信 IPC 添加新的Topic xff08 主题 xff09 在msg 目录下创建一个新的 msg文件 xff0c 并将
  • 往android studio原生java工程中添加jni的过程

    一 配置步骤 xff1a 第一步是在 src main 中建立一个文件夹cpp 第二步是在文件夹中建立两个文件一个是native lib cpp和CMakeLists txt 第三步在上述两文件中添加如下内容 xff1a span clas
  • C++迭代器

    一 什么是迭代器 xff1a C 43 43 中 xff0c 迭代器就是一个类似于指针的对象 xff0c 它能够用来遍历C 43 43 标准模板库容器中的部分或全部元素 xff0c 每个迭代器对象代表容器中的确定的地址 以下面的string
  • webpack vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin

    场景 webpack2 4 集成vue loader 64 15 2 4报错 vue loader was used without the corresponding plugin Make sure to include VueLoad
  • slamugv使用说明--5.电机编码测速

    电机编码器测速 编码器 xff08 encoder xff09 是将信号 xff08 如比特流 xff09 或数据进行编制 转换为可用以通讯 传输和存储的信号形式的设备 编码器把角位移或直线位移转换成电信号 编码器分类及原理 xff1a 按
  • STM32相关名词解释

    L N NO NC COM名词解释 L是line的意思 xff0c 相线 xff0c 俗称火线 xff1b N是neutral xff0c 中性线的意思 xff0c 在两相线中也称为零线 NO xff1a 也就是常开 xff0c 即在未通电
  • 三轴加速度计、三轴陀螺仪、三轴磁力计

    1 今天要做的事情 列出 xff1a 可能影响因素 xff0c 对影响因素做实验 如何设置对比实验 xff1f 如何设置对比实验 xff1f 三轴加速度计 1 加速度计的原理 三轴加速度 xff1a 输出的速度是去掉重力后的整体加速度 xf
  • zed相机使用

    zed立体相机 43 pyhon 43 opencv zed相机网上资料都是关于安装的教程 xff0c 后续的一些使用介绍的不是很多 xff0c 因为官方文档已经介绍的很详细 xff0c 这里介绍一下自己的学习过程 xff0c 以备查阅 x
  • 思岚A1激光雷达hector_mapping建图与定位

    ROS中最常见的定位包还是gmapping xff0c gmapping是需要里程计的数据也就是IMU或者视觉里程计的数据 xff0c 但是目前还是仅仅在电脑中测试 xff0c 并未实现树莓派与飞控通信 xff0c 因此使用不用里程计数据的
  • 科技概念/名词解释

    文章目录 自然科学算法类无人机互联网软件类硬件类计算机架构类人工智能 自然科学 量子 百度百科 量子 xff08 quantum xff09 是现代物理的重要概念 即一个物理量如果存在最小的不可分割的基本单位 xff0c 则这个物理量是量子
  • 自动驾驶基础知识(一)——英文缩写(持续更新...)

    这一篇就先整理一下接触到的英文缩写 xff0c 相当于给自己补补课 xff0c 以后遇到新的 xff0c 会持续更新上来 xff01 英文缩写中文全称英文全称ABS防抱死制动系统Anti lock Braking SystemACCS自适应
  • 自动驾驶基础知识(二)——术语中英文对照

    文章目录 深度学习自动驾驶深度增强学习计算机视觉其他 深度学习 中文名称英文名称人工智能系统Artificial Intelligence System认知负荷Cognitive Load深度学习Deep Learning3D卷积神经网络3

随机推荐