当前位置: 首页 > 知识库问答 >
问题:

将球坐标转换为笛卡尔坐标

范翰海
2023-03-14

我正在尝试将球坐标转换为笛卡尔坐标,以绘制一个简单的三维金字塔。

下面是获取金字塔四个主要角的代码,具体取决于极角yrad和方位角xrad以及顶点坐标x和y:

xpos1 = x+25*(      sin(yrad+pi/2+pi/4)*cos(-xrad+pi/2+pi/4));
zpos1 = y-35+25*(   cos(yrad+pi/2+pi/4)); 
xpos2 = x+25*(      sin(yrad+pi/2-pi/4)*cos(-xrad+pi/2+pi/4));
zpos2 = y-35+25*(   cos(yrad+pi/2-pi/4)); 
xpos3 = x+25*(      sin(yrad+pi/2-pi/4)*cos(-xrad+pi/2-pi/4));
zpos3 = y-35+25*(   cos(yrad+pi/2-pi/4)); 
xpos4 = x+25*(      sin(yrad+pi/2+pi/4)*cos(-xrad+pi/2-pi/4));
zpos4 = y-35+25*(   cos(yrad+pi/2+pi/4)); 

方位角轴似乎工作正常,但问题是,在操纵极轴角时,当它们越过天顶或底部时,左右会互换,如图所示(选择顶部的mp4以更平滑地播放):http://gyazo.com/4a245713c232893960863cf4ea4186f6

怎么了?

共有1个答案

邓阳炎
2023-03-14

呵呵,这个bug确实有一个漂亮的结果:)让我们解决它。

对于极坐标,我们定义了两个角度:

  • 极角(yrad)–绕极旋转的角度

如果我们尝试将其可视化,它看起来是这样的:

      Look from above         |          Look from side           
(Z goes positive towards you) |    (Y goes negative towards you)  
                              |                                   
            Y-  Z-            |                Z-  Y+             
            |  /              |                |  /               
            | / "far"         |                | / "far"          
            |/                |                |/                 
   X- ------+-------> X+      |       X- ------+-------> X+       
           /| yrad |          |               /| xrad ^           
   "near" / |<-----+          |       "near" / |------+           
         /  |  "polar angle"  |             /  |  "azimuth angle" 
        Z+  Y+                |            Y-  Z+                 

使用这些角度,我们可以通过以下方式计算坐标:

         Point := radius * (x = sin(xrad) * cos(yrad)
                            y = sin(xrad) * sin(yrad)
                            z = cos(xrad))

这些是常规符号(见球面坐标系)。绘制点的笛卡尔表示时,通常使用X和Y坐标,但选择了X和Z,这仍然是完全正确的。

然而,你犯的错误是,你交换了角度!

Your computation  |  x := sin( yrad ) * cos ( xrad )  |  z := cos( yrad )
------------------+-----------------------------------+------------------
Should have been  |  x := sin( xrad ) * cos ( yrad )  |  z := cos( xrad )

因此,当您更改方位角(xrad)时,您只受到X坐标的影响,这实际上效果很好(因为cos(xrad)=sin(90-xrad),所以您有一个窦的行为(如xrad所需要的)。当您旋转极角(yrad)时,事情开始变得丑陋,因为两个坐标的变化不协调(没有双关语)。

 类似资料:
  • 我试图将图像从极坐标转换为笛卡尔坐标,但在应用公式后,我得到了浮点坐标(r和teta),我不知道如何使用x和y的浮点来表示空间中的点。可能有一种方法可以将它们转换为整数,并仍然保留分布,但我不知道如何。我知道OpenCV中有像warpPolar这样的函数,但我想自己实现它。任何想法都会有帮助:) 这是我的代码:

  • 我正在尝试将极坐标的图像转换为笛卡尔坐标。 将图像转换为极坐标的示例显式执行-想要一个光滑的矩阵方法 我原以为使用上述方法是小菜一碟,但事实并非如此!!如果有人发现我的代码有错误,请告诉我! 我发现非常奇怪的是,当我改变phi时,它会做出根本性的改变,而不是以我期望的方式! 干杯

  • 我想知道是否有人帮助我理解如何将顶部图像转换为底部图像。以下链接中提供了这些图像。顶部图像采用笛卡尔坐标。底部图像是极坐标中的转换图像

  • 对于我的游戏,我需要在两个坐标系之间转换函数。这主要是一道数学题,但我需要的是C代码,以及一些解释如何解决我的问题。 屏幕坐标: a)左上角是0,0 b)无负值 c) 右=x(x值越大,右侧点越多) d) 底部=y 笛卡尔二维坐标: a) 中点为(0,0) b)减去值确实存在 c)右=x d)底部-=y(y越少,底部越点) 我需要一种简单的方法从一个系统转换到另一个系统,反之亦然。要做到这一点,(

  • 遵循笛卡尔网格的轴被称为“笛卡尔轴”。直角坐标轴用于折线图、条形图和气泡图。 Chart.js 中默认包含四个笛卡尔坐标轴。 linear logarithmic category time 所有包含笛卡尔轴的图表都支持多种通用选项。 名称 类型 默认值 描述 type String 图表类型 position String 轴在图表中的位置。可用的值有: 'top', 'left', 'bott

  • 我试图对下面的第一幅图像进行极坐标变换,最后得到第二幅。然而,我的结果是第三张图片。我有一种感觉,这与我选择的“原产地”有关,但我不确定。