创建一个大致等距点的球

如何解决创建一个大致等距点的球

我需要创建一个球体,该球体在模拟中具有或多或少的等距点。
我看过一些代码,但是它们都只给出一个球体的表面,而我需要用从中心开始的等距点填充球。

之前,我创建了一个立方体,然后切出了半径,但是这给了我平坦的边缘,同时我需要使其更圆一些,因此实际上就像一个球。

如何在球中创建等距网格?

解决方法

我使用以下内容在球形壳体上创建近似等距点的网格。它基于适当的delta_theta的选择,即(共)横向箱宽度。然后将纵向phi宽度选择为delta_theta./sind(theta_c),其中theta_c是分箱的中心纬度。换句话说:当离开(朝向)赤道时,垃圾箱的经度变宽(变小)。

注意:我使用的是姓氏和程度,即theta = [0 180)phi = [0 360)。它的最终输出是两个变量:thetaphi。它们的长度相等,(theta(i),phi(i))是垃圾箱的中心点。

delta_theta = 1;  % latitudinal bin width
theta_c = 0:delta_theta:89;  % Set up bin centres
theta_c = [-fliplr(theta_c) theta_c].'+90;  % Centre the centres on the equator
delta_phi = delta_theta./sind(theta_c);  % Grab longitudinal bin width per latitudinal bin
bins_per_theta = round(360./delta_phi);  % Ensure an integer number of bins

theta = zeros(sum(bins_per_theta),1);
phi = theta;
kk=1;

for ii=1:numel(theta_c)  % We need a loop here to deal with the changing number of bins
    phi_c =  linspace(0,360,bins_per_theta(ii));
    kk_add = numel(phi_c);
    theta(kk:kk+kk_add-1) = theta_c(ii);
    phi(kk:kk+kk_add-1) = phi_c;
    kk = kk+kk_add;
end

在此代码上进行简单循环以根据半径适当减小delta_theta可以将其填满。我想说delta_theta = 1/r具有适当的常数,会随着半径的增加而减小纬向面宽度。也许您还需要在theta_cphi_c中设置偏移量,以防止出现纯径向线。

,

对于采样体积,最直接的解决方案始终是规则的网格。随机选择点会导致采样效率降低(您需要更多点才能获得相同的表示,这是“立体学”的结果。)

但是立方网格并不是我们可以用来采样体积的唯一常规网格!晶体中的原子可以排列在各种不同的栅格中,最适合我们的是立方栅格,面心立方栅格(FCC)和体心立方栅格(BCC)-其他栅格的各向同性较小。关于使用这些网格对体积图像进行采样的许多研究论文已经发表,事实证明,在对体积进行采样时,FCC和BCC网格比立方网格效率更高。这意味着,需要更少的样本来表示具有相同误差的体积。请注意,例如,水果供应商将使用FCC或BCC网格堆叠橙子和苹果,因为它们会导致尽可能密集的球形包装。

是否使用FCC或BCC网格采样,还是使用Adriaan's之类的方法取决于最重要的是:对体积本身进行良好采样,或对体积边缘进行良好采样。

samples and voxel shape in the cubic,FCC and BCC grids (image copied from somewhere on the web)

简单的立方网格由以下矩阵表示:

 1  0  0
 0  1  0
 0  0  1

FCC网格由以下矩阵表示:

 1  1  0
 1  0  1
 0  1  1

BCC网格由以下矩阵表示:

 1  1 -1
 1 -1  1
-1  1  1

这些矩阵的行表示网格的单位向量。可以通过将矩阵乘以索引向量来获得任何网格点的坐标:

M * [i;j;k]

要找到球中的一组点,我们可以这样做:

d = 0.3; % grid spacing
r = 2.3; % ball size
M = [1  1  0
     1  0  1
     0  1  1]; % FCC grid
p = -2*r/d : 2*r/d; % take a larger area around the ball,so we're sure to sample the whole thing
[i,j,k] = ndgrid(p,p,p);
p = [i(:).'; j(:).'; k(:).'];
p = (d * M) * p;
I = sqrt(sum(p.^2,1)) < r; % can use `vecnorm` in newer MATLAB releases
p = p(:,I);
scatter3(p(1,:),p(2,p(3,:))
axis equal

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-