Opengl 圆柱体/圆锥体上三维点的均匀生成

Opengl 圆柱体/圆锥体上三维点的均匀生成,opengl,3d,geometry,trigonometry,particles,Opengl,3d,Geometry,Trigonometry,Particles,我希望在圆柱体和圆锥体上随机均匀地生成点(分别)。圆柱体由其中心、半径和高度定义。圆锥的规格相同。我能够得到每个形状的边界框,所以我想在边界框内生成点。但是,我不确定如何将它们投影到圆柱体/圆锥体上,或者这是否是最好的主意 有什么建议吗 谢谢。直接在圆柱体或圆锥体上生成点会更简单 我已经有一段时间没有这样做了,但是参数化圆柱体的轴,然后为每个点参数化该高度的圆。这将在曲面上创建点。圆的半径就是圆柱体的半径 对于圆锥体,当从底部移动到顶点时,需要减小圆的半径。要将这些答案放入伪代码中: 对于圆柱体

我希望在圆柱体和圆锥体上随机均匀地生成点(分别)。圆柱体由其中心、半径和高度定义。圆锥的规格相同。我能够得到每个形状的边界框,所以我想在边界框内生成点。但是,我不确定如何将它们投影到圆柱体/圆锥体上,或者这是否是最好的主意

有什么建议吗


谢谢。

直接在圆柱体或圆锥体上生成点会更简单

我已经有一段时间没有这样做了,但是参数化圆柱体的轴,然后为每个点参数化该高度的圆。这将在曲面上创建点。圆的半径就是圆柱体的半径


对于圆锥体,当从底部移动到顶点时,需要减小圆的半径。

要将这些答案放入伪代码中:

对于圆柱体,给定圆柱体半径和圆柱体高度:

angle = random number between 0 & 360

x = cos(pi/180*angle)*cylinderRadius
y = sin(pi/180*angle)*cylinderRadius
z = random number between 0 and cylinderHeight.
对于圆锥体,给定圆锥半径,圆锥高度:

angle = random number between 0 & 360

z = random number between 0 and coneHeight

thisRadius = coneRadius * (1-(z/coneHeight)); //This gives a decreasing radius as height increases.

x = cos(pi/180*angle)*thisRadius
y = sin(pi/180*angle)*thisRadius

每个点(x、y、z)将位于圆柱体/圆锥体上。生成足够多的这些点,您可以在圆柱体/圆锥体的表面上生成粒子,但它可能不会形成完全均匀的分布…

考虑这一点的一种方法是,圆柱体和圆锥体都可以展开为平面-只需使用从上到下的直线切割每个平面即可

圆柱体展开为矩形(如果包括顶部和底部,则添加两个磁盘)

圆锥体展开为一个三角形,底部为圆弧(如果包括圆锥体的底部,则添加一个圆盘)

将这些平面嵌入xy平面上的矩形
R
,非常简单。在
R
中生成均匀分布的点,当它们位于平面内时,将其映射回原始曲面


注意这里的一些其他答案,它们试图在角度和高度方面协调圆锥体。尽管这些点在角度和高度方面将均匀分布,但它们不会均匀分布在w.r.t.区域。它们将更密集地分布在尖端。

让一个点由坐标r、a、h定义,其中r是“半径”(从中心穿过的垂直轴的距离),a是极坐标中的角度,h是其高度

对于圆柱体(半径R和高度H):独立选择

  • [0,2pi]中的均匀分布
  • h在[0,h]中均匀分布,且

  • 具有“三角形密度”的r:f(r)=2 r/r,如果半径为r的圆或圆锥体上的均匀点为0,高度/高程为H:

    generate:
      angle= uniform_random(0,2*pi)
      value= uniform_random(0,1)
    
    in either case, let:
      r= R * sqrt(value)
    
    then (using separate random numbers for each):
      circle_point= point3d( r*cos(angle), r*sin(angle), H )
    or:
      cone_point= point3d( r*cos(angle), r*sin(angle), r*H )
    
    请注意,如果您想在圆锥体上创建一个底座,则需要将其与曲线形状分开。为了确保不同零件的点密度相同,一种简单的方法是计算零件的面积,并为每个零件生成成比例的点数

    sqrt(值)可以确保随机点的密度是均匀的。正如其他问题所提到的,你需要一个三角形分布;使用sqrt()将[0,1]上的均匀分布转化为三角形分布

    对于不需要sqrt()的圆柱体,弯曲部分为:

      cylinder_point= point3d( R*cos(angle), R*sin(angle), H*value )
    

    圆柱体的情况很简单,如果半径r>0,高度h>0的圆柱体是φ上(x,y,z)=(r cosφ,r sinφ,z)的图像∈ [0,2π]和z∈ [-h/2,h/2],然后在这些间隔上随机选择φ和z。当然,也可以使用标准参数化简单地对圆锥体进行参数化,但面积元素在参数平面上不会是常数,因此点的分布不会是随机的。因此,您需要找到不同的参数化。我已经对此进行了讨论图中详细描述了位于的球体。

    其他答案已经很好地涵盖了圆柱体的情况。对于圆锥体来说,事情有点困难。要保持点的恒定密度,需要补偿半径的变化

    要做到这一点,你可以从点之间的距离开始。当你沿着圆锥体的轴移动时,你计算出该高度处的周长,然后将周长除以点之间的线性距离,得到点数。然后再除以2pi弧度(或360度,或其他)通过点的数量获得该半径的角距离

    根据您需要的精度,您可以在计算下一个圆时跟踪一个圆的余数。例如,如果一行中有两个圆需要xxx.4分,如果单独查看,您会将每个圆向下四舍五入,但如果一起查看,您有xxx.8分,因此您应该向下四舍五入一个圆另一种方法是使总密度尽可能接近正确的值


    请注意,虽然不太明显,但后者也适用于圆柱体——在分布每个点圆时,通常会有一些舍入。

    Oops。你是说在曲面上?是的,根据定义,圆柱体(和圆锥体)是空间中的一个表面,而不是一个实体。我认为OP确实使用了这个数学定义,因为他使用了介词“on”而不是“inside”。我对你的定义一点也不确定(),但是我已经用两种形状的侧面上的点进行了更新。问题是要找到一个均匀的分布,而圆锥体的代码不是这样的。看起来比是从1.5到0.5。你可能需要比=(max_y-y)/cone->Height()。另外,要阻止点在顶点周围聚集,你需要y=(max_y-min_y)*(1-sqrt(RandomNumber())+min_y编辑中的问题已得到回答。您是否可以清理它,或添加另一个编辑以表明它已得到回答?