C++ 如何在高于2D的维度中旋转、旋转、螺旋

C++ 如何在高于2D的维度中旋转、旋转、螺旋,c++,geometry,noise,C++,Geometry,Noise,我在C++中有如下代码: for(int x = position.x; x < position.x + dimensions.x; ++x) { for(int y = position.y; y < position.y + dimensions.y; ++y) { glm::vec2 tc = glm::vec2(x,y); tc -= spiralPosition; float distance = glm::

我在C++中有如下代码:

for(int x = position.x; x < position.x + dimensions.x; ++x)
{
    for(int y = position.y; y < position.y + dimensions.y; ++y)
    {
        glm::vec2 tc = glm::vec2(x,y);
        tc -= spiralPosition;
        float distance = glm::length(tc-position);
        if(distance < spiralRadius)
        {
            float percent = (spiralRadius - distance) / spiralRadius;
            float theta = percent * percent * angle;
            float s = std::sin(theta);
            float c = std::cos(theta);
            tc = glm::vec2(glm::dot(tc,glm::vec2(c,-s)),glm::dot(tc,glm::vec2(s,c)));
        }
        tc += spiralPosition;
        returnValues[x][y] = noise->GetValue(tc);
    }
}
for(int x=position.x;x获取值(tc);
}
}
它的作用是生成一个包含渐变噪波值的容器。当它这样做的时候,它也会像飓风一样围绕着震中旋转结果。它基于此处的代码,结果看起来相同:

我现在想做的是把它扩展到3D,4D,基本上是nD

我不熟悉三角学,无法理解需要做什么。我有一个想法,第三维度需要切线,但是我不知道如何做第四维度


有人能给我指出一些能帮助我理解的文章吗?谷歌并没有真正帮助我(但是我真的可能使用不正确的搜索词)。<你的问题是用C++标记的,但是不清楚你用什么类的n维向量数学,所以我会尝试用数学的方法回答这个问题。假设您有类来表示N维向量和NxN维矩阵(即从N维欧氏空间到自身的线性映射)

概括2d代码,计算螺旋贴图的算法如下所示:

  • 将缓和曲线的中心平移到原点()
  • 获取要映射的点与原点的距离(使用)
  • 基于该距离计算旋转角度(
    theta=percent*percent*angle;
  • 通过围绕圆心旋转,将以该半径原点为中心的N-1维球体映射到自身上
  • 将原点平移回缓和曲线的中心
  • 第四步很可能是你陷入困境的地方。在将(旋转)映射推广到N-1维球体时,必须记住,其中指出:

    在偶数维n-球上不存在非方连续切向量场

    这意味着,对于奇数维向量空间(即偶数维嵌入球体),螺旋贴图中始终至少有一个可见的固定点,这是无法避免的。在本例中,由于您使用的是旋转映射,因此将有两个固定点,其中一个固定点位于选定旋转轴与n-1球体相交的位置

    现在,n维欧几里德空间中前两维之间的n维螺旋映射看起来像(作为NxN线性变换矩阵):

    然后,可以在后续轴对之间组合螺旋变换,以获得以下NxN线性变换矩阵:

        ⎡cos(θ)   −sin(θ)    0     .     0⎤
        ⎢sin(θ)    cos(θ)          .      ⎢
    S = ⎢  0          0      1     .     0⎢
        ⎢  .          .      .     .      ⎢
        ⎣  0          0                  1⎦
    
        ⎡cos(θ)   −sin(θ)     0         0                  ⎤
        ⎢sin(θ)    cos(θ)     0         0                  ⎢
        ⎢  0         0      cos(θ)   −sin(θ)               ⎢
    S = ⎢  0         0      sin(θ)    cos(θ)               ⎢
        ⎢                                      .           ⎢
        ⎢                                            .     ⎢
        ⎣                                                 1⎦
    
    注意最后一个单元格中的尾随
    1
    ?当你的N维空间有奇数个维度时,这就是问题所在,多亏了毛球定理,这是无法避免的

    在3维中,这将成为围绕Z轴的螺旋:

        ⎡cos(θ)   −sin(θ)      0⎤
    S = ⎢sin(θ)    cos(θ)      0⎢
        ⎣   0         0        1⎦
    
    因此,如果
    O
    是螺旋的中心,而
    p
    是要变换的点,则整个变换将是:

    newP = O + S(P - O)
    

    如果您希望绕不同的轴螺旋,则可以构造旋转矩阵
    R
    ,将该轴带到Z轴,然后整个螺旋矩阵将变为
    (R⁻imk_)*S*R
    。要创建旋转矩阵
    R
    ,请参见例如..

    查看和。非常感谢您的回答,向量/矩阵数学是通过GLM库实现的。我在上面得到的是我的偏移位置乘以上面的
    S
    矩阵吗?矩阵中缺失的值是什么(我遗漏了什么)?@DavidMurphy-这些都是块对角矩阵,所以左上角和右下角都是零。GLM只支持2d和3d向量,对吗?它的4d向量实际上是用于颜色空间的?不,据我所知,它完全支持4d向量。是的,它们通常用于颜色,但你可以对它们进行任何常规向量运算。