我正在尝试一些基本的光线追踪,并且我有一个 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 方向增加。
最佳答案
如果您在@dario_ramos 方程中代入 90 度,您会得到:
x' = -y
y' = x
顺便说一句,如果你曾经在格子纸上画过这个,你就会明白为什么它如此微不足道。
关于c++ - 将任意梯度旋转 90 度的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794938/