我正在尝试一些基本的光线追踪,我有一个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中增加。
答案 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()比较昂贵(
)