2014-02-12 4 views
1

Я выполнял некоторые операции с двумерными точками, выраженными в однородных координатах (x, y, w). Иногда одна из координат становится очень большой, и это может легко повлиять на последующие результаты.Нормализация однородных координат (2D)

Например, определение пересечений легко вычисляется с помощью векторного x-произведения. Это может привести к большим числам. Например. (50, 100, 1) x (-100, 50, 1) = (50, -150, 12500)

Я считаю, что эти результаты должны быть как-то нормализованы. В приведенном выше примере просто деление всех координат на 12500 кажется разумным. В целом я вижу 2 пути:

  1. разделить на координате с наибольшим абсолютным значением (не может быть ш), или
  2. разделите на ш (если ш = 0!), Так что каждая точка выражается либо (x, y, 0), либо (x, y, 1).

Так что мой вопрос в том, какой путь лучше и почему?

Я использую C# с float значениями, если это имеет какую-либо практическую значимость.

ответ

1

Уменьшение масштаба по абсолютной величине компонентов является более безопасным вариантом среди всех правильных - вам никогда не придется беспокоиться о переполнениях до тех пор, пока max> 1.0. Деление на w требуется только для преобразования в евклидовы точки.

Кстати, работа с поплавками редко бывает хорошей идеей при внутренних расчетах, хотя может иметь смысл хранить конечные результаты, соответствующие физическим величинам, которые вы измеряете. При выполнении геометрических расчетов, по моему опыту, ошибки усечения часто распространяются достаточно быстро, даже с хорошо отрегулированными алгоритмами, чтобы сделать рассчитанные результаты в одинарной точности довольно бесполезными.

Смежные вопросы