算法旋转任意梯度90度
Algorithm to rotate arbitrary gradient 90 degrees either way
我正在尝试一些基本的光线追踪,我有一个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—θ是渐变(在纸上)从水平到+ y轴的夹角。
edit——incX和incY表示原始梯度(真的,真的)分别在X和Y方向增加。
如果你把90度代入@dario_ramos方程,你会得到:
x' = -y
y' = x
顺便说一句,如果你把它画在格子纸上,你就会明白为什么它是如此微不足道。
一般公式为:
x' = x cos(theta) - y sin(theta)
y' = x sin(theta) + y cos(theta)
你不需要用一个标志来表示方向:事实上,它是顺时针还是逆时针是用符号来表示的,你定义了它。例如,定义正表示逆时针。该公式考虑了这两种情况
Edit:如果你只想旋转90度,就用yi_H的解决方案;它更高效,因为相比之下cos()和sin()占用的cpu更大
相关文章:
- 函数复杂度分析
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在C++中使用OpenCV矩阵中的特征将图像旋转90度
- 顺时针旋转 M*N 矩阵 90 度,C++
- 从iPhone相机拍摄的视频似乎被OpenCV旋转了90度?我该如何解决这个问题?
- 顺时针旋转90度图像
- C++向量的向量.阵列旋转 90 度
- 在C 中旋转像素阵列90度
- 将轴对齐的矩形旋转90度
- 在 iOS 中将 Spirte 矩形旋转 90 度不会显示纵横比
- 将2D转换的1D阵列顺时针旋转90度
- 如何将计算机绘图旋转 90 度
- 当 x 为 90 度或 pi/2 弧度时,将 cos(x) 计算为 0,以C++为单位
- 圆球相机倒置在90度的方位角
- 这个算法获取所有单词梯的时间复杂度是多少?
- 旋转NxN矩阵计数器(反)-顺时针90度
- 算法旋转任意梯度90度
- 将Opencv矩阵旋转90、180、270度
- 字节数组,我需要把它旋转 90 度
- 在c++中以任意给定度旋转像素数组(例如45度)