Алгоритм поворота произвольного градиента на 90 градусов в любом случае - PullRequest
0 голосов
/ 22 июля 2011

Я пытаюсь провести элементарную трассировку лучей, и у меня есть 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 соответственно.

Ответы [ 2 ]

5 голосов
/ 22 июля 2011

если вы подставите 90 градусов в уравнение @dario_ramos, вы получите:

x' = -y
y' = x

Кстати, если вы когда-нибудь нарисуете это на проверенной бумаге, вы поймете, почему это так тривиально.

2 голосов
/ 22 июля 2011

Общая формула:

x' = x cos(theta) - y sin(theta)
y' = x sin(theta) + y cos(theta)

Вам не нужно использовать флаг для ориентации: тот факт, что он по часовой стрелке или против часовой стрелки представлен знаком тета, вы определяете это.Например, определите, что положительная тета означает против часовой стрелки.Формула учитывает оба случая

Редактировать: Используйте решение yi_H, если вы хотите повернуть только на 90 градусов;это более эффективно, поскольку cos () и sin () по сравнению с процессором стоят дороже

...