【问题标题】:creating a sphere from 2d coords using sine and cosine使用正弦和余弦从二维坐标创建球体
【发布时间】:2016-02-02 04:36:15
【问题描述】:

什么。我要实现的是拥有一个 2d 坐标数组并将它们映射到球体的 3d 表面。为了弄清楚如何做到这一点,我有一个 xy 坐标数组

我正在使用以下循环在每个轴上生成从 0 到 1 的 20*20 xy 坐标:

var plot = []

for (var i = 0; i <= 20; i++) {
for (var ii = 0; ii <= 20; ii++) {
    plot.push({
        x: ii/20,
        y: i/20
    })
}
}

然后我遍历数组并将 xy 值转换为 xyz 值:

for (var i = 0; i < plot.length; i++) {
points.push({
    x: Math.sin(plot[i].x*(6.283185307)) * Math.sin(plot[i].y * Math.PI),
    y: plot[i].y * 2,
    z: Math.cos(plot[i].x*(6.283185307)) * Math.sin(plot[i].y * Math.PI)

});
}

我有两个问题:

  • 我必须使用 6.2831.. 因为 Math.sin(Math.PI*2) 不返回 0

  • 返回的球体在 y 轴上不稳定:

【问题讨论】:

  • Math.sin(Math.PI*2) = -2.4492935982947064e-16, Math.sin(6.283185307) = -1.7958636867904636e-10。 Math.PI*2 比 6.283185307 更接近 0
  • 你也可以写Math.sin ( angle % ( Math.PI * 2 ) ),然后返回0

标签: javascript math three.js


【解决方案1】:

你得到的是围绕y 轴旋转半个正弦波,y in 0..2 的水平半径为sin(y*pi/2)。因此,尖端在北极和南极。


坐标应该是,使用u=plot[i].x * 2*Math.PIv=plot[i].y * Math.PI

x : sin(u)*sin(v)
y : cos(v)
z : cos(u)*sin(v)

这会给你在单位球面上的分数。您对Math.sin(Math.PI*2) 的担忧是没有根据的,我希望Math.sin(6.283185307) 离零更远,因为该论点是2*pi 的更差近似值。 (正如 Tomasz Jakub Rup 评论中的实际值所证实的那样。)

【讨论】:

    【解决方案2】:

    在某些应用程序中需要确保点完全匹配。例如,如果你想建立一个没有边界的球体网格。在这种情况下,您可能需要分别处理边界点。

    for (var i = 0; i <= 20; i++) {
        for (var ii = 0; ii <= 20; ii++) {
            theta = 2* Math.PI * i /20;
            phi = Math.PI * ii / 20;
    
            if(ii==0)   // North Pole
                points.push( {x:0; y:1, z:0} )
            else if(ii==20)   // South Pole
                points.push( {x:0; y:-1, z:0} )
            else if(i== 0 || i == 20) // 0º longitude
                points.push({ x: 0,
                    y: Math.cos(phi),
                    z: Math.sin(phi) } )
            else
                points.push({ x: Math.sin(theta) * Math.sin(phi),
                    y: Math.cos(phi),
                    z: Math.cos(theta) * Math.sin(phi) });
         }
    }
    

    如果准确的坐标很重要,您可以考虑为赤道和 90º、180º、270º 经度添加案例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多