任意梯度旋转90度的算法

0 c++ trigonometry rotation

我正在尝试一些基本的光线追踪,我有一个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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我已经在纸上围绕象限,但是我忘了Windows颠倒传统的y轴(因此我认为顺时针方向不是,但这是一个任意错误而且不重要).我真正想要的是,无论哪种方式将我的渐变旋转90度都是一种万无一失的方法.谢谢.

edit-- theta是渐变形成的水平到+ ve y轴的角度(在纸上).

edit-- incX和incY意味着原始渐变(真的,真的)分别在X和Y中增加.

Kar*_*ath 5

如果你在@dario_ramos方程中取代90度,你得到:

x' = -y
y' = x
Run Code Online (Sandbox Code Playgroud)

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