任意梯度旋转90度的算法

时间:2011-07-22 19:14:49

标签: c++ rotation trigonometry

我正在尝试一些基本的光线追踪,我有一个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-- theta是渐变形成的水平到+ ve y轴的角度(在纸上)。

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

2 个答案:

答案 0 :(得分:5)

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

x' = -y
y' = x

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

答案 1 :(得分:2)

通用公式为:

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

你不需要为方向使用一个标志:它是顺时针或逆时针的事实由theta的符号表示,你定义它。例如,定义正θ意味着反向。该公式考虑了两种情况

编辑:如果您只想旋转90度,请使用yi_H的解决方案;它更有效率,因为cos()和sin()比较昂贵(