C++ 如何在高于2D的维度中旋转、旋转、螺旋
我在C++中有如下代码: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::
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;
) ⎡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向量。是的,它们通常用于颜色,但你可以对它们进行任何常规向量运算。