python - 如何在不规则物体内部生成随机点和格点?
问题描述
我有一个不规则的 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]
???????
解决方案
对于封闭形状内的随机点:
- 选择样品的线性密度
- 制作包围形状的边界框
- 选择框上的入口点
- 选择出口点,计算方向余弦(w x , w y , w z)。沿射线查找形状内的所有线段
- 从入口点开始射线
- 到达第一段并将其设置为 p start
s
具有选定线性密度的指数分布的样本长度- 找到点 p end = p start + s (w x , w y , w z )
- 如果它在第一段,则存储它,并使 p start = p end。转到步骤 7。
- 如果不是,则转到另一个段的开头,并将其设置为 p start。转至第 7 步。如果没有剩余线段,则您已完成一条射线,请转至第 3 步并生成另一条射线。
生成一些预定义数量的光线,收集所有存储的点,然后你就完成了
推荐阅读
- visual-studio - 从 Visual Studio 连接到 mac 时出错
- html - 减小 Twitter Feed 的大小
- php - 如何关闭 SSL 上的 apache 缓存?
- gcc - Contiki 中的 tinydtls 配置
- r - 加载 ggplot2 后,Highcharter 绘图失败
- c# - 从 C# Stream 读取而无需忙于等待
- ssl - 允许 kubernetes storageclass 使用自签名证书重新 URL HTTPS
- arrays - 如何创建一个 3 维数组,然后一次提取 1 个维度的信息?
- rest - 我无法在 SharePoint 图片库中按“名称”筛选
- mysql - 从多个表中获取计数