算法旋转任意梯度90度

Algorithm to rotate arbitrary gradient 90 degrees either way

本文关键字:90度 任意梯 旋转 算法      更新时间:2023-10-16

我正在尝试一些基本的光线追踪,我有一个2D梯度(称为dybydx)。我从一个正方形的中心开始跟踪,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度。谢谢。

edit—θ是渐变(在纸上)从水平到+ y轴的夹角。

edit——incX和incY表示原始梯度(真的,真的)分别在X和Y方向增加。

如果你把90度代入@dario_ramos方程,你会得到:

x' = -y
y' = x

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

一般公式为:

x' = x cos(theta) - y sin(theta)
y' = x sin(theta) + y cos(theta)

你不需要用一个标志来表示方向:事实上,它是顺时针还是逆时针是用符号来表示的,你定义了它。例如,定义正表示逆时针。该公式考虑了这两种情况

Edit:如果你只想旋转90度,就用yi_H的解决方案;它更高效,因为相比之下cos()和sin()占用的cpu更大