几何图形 - 将3D点划分为具有特定角度的线段

时间:2018-04-03 18:12:23

标签: python geometry computational-geometry angle point-clouds

我有一堆像cylinder(x, y, z)一样的点,如图:。

cylinder

我想将其划分为特定角度内的3D片段。

看起来我有馅饼,我需要把它切成碎片。

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用https://github.com/daavoo/pyntcloud并以.ply格式使用示例this cylinder来执行您想要的操作。

您可以加载圆柱体:

  <td width="9%" height="5%">
    <span title="{{val.customerTypeDescNM[$index]}}" ng-repeat="item in val.customerType.split(',') track by $index">{{item}}</span>
     </td>

这是一个三角形网格,如下所示:

cylinder mesh

您可以按如下方式从网格生成点云(如果您已将圆柱体作为点云,则此步骤不是必需的):

from pyntcloud import PyntCloud
cylinder = PyntCloud.from_file("cylinder.ply")

现在看起来像这样:

cylinder point cloud

现在我认为正确的方法是进行“饼图分割”。

您可以将(x,y,z)笛卡尔坐标转换为(ro,phi,z)圆柱坐标,如下所示:

n_points = 100000
cylinder = cylinder.get_sample(
    "mesh_random_sampling",
     n=n_points,
     as_PyntCloud=True)

“phi”标量字段是一个值,用于识别您感兴趣的角度的每个点。可视化更具说明性:

cylinder phi scalar field

您现在可以使用此phi值将点分成所需的段数:

cylinder.add_scalar_field("cylindrical_coords")

现在,cylinder.points [“segment”]具有唯一值,将每个点分配给“饼图段”。

可视化再次有助于理解“饼段”:

cylinder pie segment

答案 1 :(得分:0)

得到:
- 基点O - 圆柱底座的中心,位于平面L
中 - 汽缸轴单位矢量N
- 平面L中的基矢量V,与某些切割方向共线 - 第二个基数U,垂直于N和V (U = N x V)

然后,对于云中的每个点P,将其投影到平面上并找到相应的向量

P' = P - N * ((P-O).dot.N)
W = P'-O

使用

获取平面中相对于V的角度(和扇区)
angle = atan2(W.dot.U, W.dot.V)