C++ 任意方向旋转任意梯度90度的算法
我正在尝试一些基本的光线追踪,我有一个叫做dybydx的2D渐变。我从一个正方形的中心,0.5,0.5进行追踪,并希望设置垂直于梯度的额外追踪,以增加~<0.5的观察范围。我对fp算法相当陌生,这在我调试时会引起一些头痛 我希望下面的代码能够解释其余部分:C++ 任意方向旋转任意梯度90度的算法,c++,rotation,trigonometry,C++,Rotation,Trigonometry,我正在尝试一些基本的光线追踪,我有一个叫做dybydx的2D渐变。我从一个正方形的中心,0.5,0.5进行追踪,并希望设置垂直于梯度的额外追踪,以增加~
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度。谢谢
编辑-θ是渐变在纸上形成的从水平方向到+ve y轴的角度
编辑-incX和incY表示原始梯度实际上,实际上分别在X和Y上增加。一般公式为:
x' = x cos(theta) - y sin(theta)
y' = x sin(theta) + y cos(theta)
方向不需要使用标志:它是顺时针或逆时针的事实由θ的符号表示,这是您定义的。例如,定义正θ表示逆时针方向。该公式考虑了这两种情况
编辑:如果你只想旋转90度,请使用yi_H的解决方案;它的效率更高,因为相比较而言,cos和sin的cpu成本更高如果在@dario_ramos方程中替换90度,则得到:
x' = -y
y' = x
顺便说一句,如果你在一张方格纸上画这个,你就会明白为什么它如此微不足道。θ是我原始梯度的角度,我想你是说我需要加/减π/2来实现90'旋转?把它想象成旋转任何向量。事实上,它是一个梯度在这里并不重要。将公式应用于梯度向量,θ=pi/2或-pi/2,顺便说一句,我建议您编写一个向量类,一个旋转方法并重用它。它将使您的代码更清晰。ERA是解决您的问题的良好起点。。。。这正是@dario_ramos所做的。顺便说一下,还有向量。