Я пытаюсь провести элементарную трассировку лучей, и у меня есть 2D-градиент (называемый dybydx). Я прослеживаю от центра квадрата, 0.5, 0.5, и хотел бы установить дополнительные кривые, нормальные к градиенту, чтобы увеличить поле наблюдения (на ~ <0.5). Я довольно плохо знаком с арифметикой fp, и это вызывает некоторые царапины на голове при отладке. </p>
Я надеюсь, что следующий код объясняет остальное:
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 соответственно.