C++ 任意方向旋转任意梯度90度的算法

C++ 任意方向旋转任意梯度90度的算法,c++,rotation,trigonometry,C++,Rotation,Trigonometry,我正在尝试一些基本的光线追踪,我有一个叫做dybydx的2D渐变。我从一个正方形的中心,0.5,0.5进行追踪,并希望设置垂直于梯度的额外追踪,以增加~

我正在尝试一些基本的光线追踪,我有一个叫做dybydx的2D渐变。我从一个正方形的中心,0.5,0.5进行追踪,并希望设置垂直于梯度的额外追踪,以增加~<0.5的观察范围。我对fp算法相当陌生,这在我调试时会引起一些头痛

我希望下面的代码能够解释其余部分:

        if (incX) {
        if (incY) {
            if (cclockwise) {
                x -= System::Math::Sin(theta) / 2;
                y += System::Math::Cos(theta) / 2;
            } else {
                x += System::Math::Sin(theta) / 2;
                y -= System::Math::Cos(theta) / 2;
            }
        } else {
            if (cclockwise) {
                x += System::Math::Cos(theta) / 2;
                y += System::Math::Sin(theta) / 2;
            } else {
                x -= System::Math::Cos(theta) / 2;
                y -= System::Math::Sin(theta) / 2;
            }
        }
    } else {
        if (incY) {
            if (cclockwise) {
                x -= System::Math::Cos(theta) / 2;
                y -= System::Math::Sin(theta) / 2;
            } else {
                x += System::Math::Cos(theta) / 2;
                y += System::Math::Sin(theta) / 2;
            }
        } else {
            if (cclockwise) {
                x += System::Math::Sin(theta) / 2;
                y -= System::Math::Cos(theta) / 2;
            } else {
                x -= System::Math::Sin(theta) / 2;
                y += System::Math::Cos(theta) / 2;
            }
        }
    }
我在纸上画了一圈又一圈的象限,但我忘记了Windows反转了传统的y轴,因此我认为顺时针方向不是,但这是一个任意的错误,并不重要。我真正想要的,是一个傻瓜式的方法来旋转我的梯度90度。谢谢

编辑-θ是渐变在纸上形成的从水平方向到+ve y轴的角度


编辑-incX和incY表示原始梯度实际上,实际上分别在X和Y上增加。

一般公式为:

x' = x cos(theta) - y sin(theta)
y' = x sin(theta) + y cos(theta)
方向不需要使用标志:它是顺时针或逆时针的事实由θ的符号表示,这是您定义的。例如,定义正θ表示逆时针方向。该公式考虑了这两种情况


编辑:如果你只想旋转90度,请使用yi_H的解决方案;它的效率更高,因为相比较而言,cos和sin的cpu成本更高

如果在@dario_ramos方程中替换90度,则得到:

x' = -y
y' = x

顺便说一句,如果你在一张方格纸上画这个,你就会明白为什么它如此微不足道。

θ是我原始梯度的角度,我想你是说我需要加/减π/2来实现90'旋转?把它想象成旋转任何向量。事实上,它是一个梯度在这里并不重要。将公式应用于梯度向量,θ=pi/2或-pi/2,顺便说一句,我建议您编写一个向量类,一个旋转方法并重用它。它将使您的代码更清晰。ERA是解决您的问题的良好起点。。。。这正是@dario_ramos所做的。顺便说一下,还有向量。