首页 > 解决方案 > 如何在不规则物体内部生成随机点和格点?

问题描述

我有一个不规则的 3d 对象,想知道这个对象的表面。对象可以是凸型或非凸型。我可以应用任何方法(如行进立方体、表面轮廓或等值面)来获取该对象的表面。

所有这些方法都给了我三角网格,它基本上包含边和顶点。

我的任务是在对象内部生成随机点和格点。

我应该如何检查我的点是在内部还是外部?

有什么建议吗?非常感谢。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

from skimage import measure, io
from skimage.draw import ellipsoid
import skimage as sk 
import random 

I=np.zeros((50,50,50),dtype=np.float)

for i in range(50):
  for j in range(50):
    for k in range(50):
        dist=np.linalg.norm([i,j,k]-O)
        if dist<8:
            I[i,j,k]=0.8#random.random()  
        dist=np.linalg.norm([i,j,k]-O2)
        if dist<16:
            I[i,j,k]=1#random.random()  

verts, faces, normals, values = measure.marching_cubes_lewiner(I,0.7)

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='3d')
mesh = Poly3DCollection(verts[faces])
mesh.set_edgecolor('k')
ax.add_collection3d(mesh)
plt.show()

%now forget the above code and suppose i have only verts and
%faces information. Now how to generate random points inside this Data

Data=verts[faces]
???????

标签: pythonnumpyrandom

解决方案


对于封闭形状内的随机点:

  1. 选择样品的线性密度
  2. 制作包围形状的边界框
  3. 选择框上的入口点
  4. 选择出口点,计算方向余弦(w x , w y , w z)。沿射线查找形状内的所有线段
  5. 从入口点开始射线
  6. 到达第一段并将其设置为 p start
  7. s具有选定线性密度的指数分布的样本长度
  8. 找到点 p end = p start + s (w x , w y , w z )
  9. 如果它在第一段,则存储它,并使 p start = p end。转到步骤 7。
  10. 如果不是,则转到另一个段的开头,并将其设置为 p start。转至第 7 步。如果没有剩余线段,则您已完成一条射线,请转至第 3 步并生成另一条射线。

生成一些预定义数量的光线,收集所有存储的点,然后你就完成了


推荐阅读