如何在圆柱体内生成随机点

时间:2019-06-24 16:26:50

标签: matlab random montecarlo cylindrical

如何在给出这些参数的圆柱体内生成均匀分布的点,中心点表示为C,C1是底部,C2是顶部,R是半径。 C1 = [5.697592e-01,3.159923e-01,1.037074e + 00]; C2 = [4.211637e-01,5.624242e-01,7.937364e-02]; R = 5.000000e-01;

%the cordinate 
        C1=[5.697592e-01, 3.159923e-01, 1.037074e+00];
        C2=[4.211637e-01, 5.624242e-01, 7.937364e-02];
        N=600;
        CylinderX = rand(1,N);
        CylinderY = rand(1,N);
        CylinderZ = rand(1,N);
        CylinderHeight = norm(C1 - C2);

        for i = 1 : N
            A = [0 0 0 1];
            x = rand;
            y = rand;
            Px = sqrt(x)*R*cos(2*pi*y);
            Py = sqrt(x)*R*sin(2*pi*y);
            Pz = CylinderHeight * rand;
            %I need the coordinate transformation  logic here

            CylinderX(i) = A(1);
            CylinderY(i) = A(2);
            CylinderZ(i) = A(3);
        end
        plot3(CylinderX , CylinderY , CylinderZ ,'G.');hold on;

2 个答案:

答案 0 :(得分:1)

您似乎做得很好,以一端为中心的轴对齐圆柱体为采样。

但是目标圆柱体既未对齐轴也未钉在原点上。

您需要将生成的点转换为空间中的适当区域。

在从C1C2的方向上构造一个单位向量,并构造两个相互垂直的单位法线。 1 这三个向量(我将其称为{{ 1}},b1b2)构成基础,并且转换后的点是

b3

我沿轴p = C1 + (b1 * x + b2 * y + b3 * z) 称单位矢量。


1 构造哪对是任意的,天真的方法是取b3与任何不(反)平行的向量的叉积。得到第一个法线方向(b3),然后b1越过b3得到第二个法线方向。唯一的麻烦是选择不平行于b1的初始向量。

答案 1 :(得分:0)

在3D对象(例如球体或圆柱体)中生成均匀分布的点的最简单方法是在立方体内生成均匀分布的点,并丢弃位于所需形状之外的任何点。