Сопоставление случайной 2D-формы с параметрической прямоугольной сеткой UV

Я хочу сопоставить некоторую случайную 2D-форму с параметрическим пространством uv, например, A: (u: 0,0 v: 1,0) B: (u: 0,0 v: 0,0) C: (u: 1,0 v: 1,0) D: (u: 1,0) v: 0.0) и хотите сопоставить случайную точку P внутри элемента с параметрическим пространством.

Линии AB, AC, BD, CD состоят из путей или могут быть представлены в виде связанных ребер.

Итак, вопрос в том, как мне получить правильное значение uv для P? У меня есть некоторые знания в области графики и геометрии, поэтому, если необходимо, не могли бы вы порекомендовать какую-либо базовую статью, в которой я могу найти какой-либо намек на решение проблемы? Большое спасибо

введите здесь описание изображения


person andkspark    schedule 23.04.2018    source источник
comment
Как представлена ​​ваша случайная форма?   -  person Nico Schertler    schedule 24.04.2018
comment
У меня есть 4 типа формы: эллипс, прямоугольник, многоугольник, а остальные - закрытый путь, как фигура. Все формы замкнуты и представлены в 2D пространстве. Поскольку моя система построена на QT, они представлены как qgraphicsItemClass или svg. е. грамм. эллипс имеет центральную точку и r, а прямоугольник имеет 4 точки и длину краев.   -  person andkspark    schedule 24.04.2018
comment
Каждую форму можно преобразовать в путь или набор ребер. При преобразовании доступна функция-член, такая как получение dx, dy определенной точки. Цвет равномерный. Точка ABCD выбирается пользователем и должна быть на границе или внутри фигуры.   -  person andkspark    schedule 24.04.2018
comment
Итак, вы хотите преобразовать 2D в 2D? Тогда, возможно, просто используйте билинейную интерполяцию.   -  person Nico Schertler    schedule 24.04.2018
comment
Взгляните на патчи Coons. Я думаю, вы можете адаптировать их к вашему случаю. (Но, к сожалению, они решают обратную задачу (u, v) на (x, y)) и вам придется решать нелинейные уравнения.)   -  person Yves Daoust    schedule 24.04.2018
comment
Спасибо за оба. Моим первым подходом к проблеме была билинейная интерполяция. Но, поскольку мои формы не прямоугольные, я мог получить некоторые приблизительные значения. На первый взгляд, приняв патч для енотов, я думаю, что смогу получить более смешанный ответ. Еще раз спасибо за оба :)   -  person andkspark    schedule 24.04.2018


Ответы (1)


То, о чем вы спрашиваете, не так просто.

Вы можете сгенерировать преобразование координат (u, v) в декартовы координаты (x, y) с помощью двух интерполянтов Кунса X(u, v) и Y(u, v).

Теперь, если вы хотите инвертировать отношение, вам нужно будет решить систему

X(u, v) = x
Y(u, v) = y

который является нелинейным.

Если у вас есть много точек для отображения (что вполне вероятно), способ решить проблему — применить сетку в пространстве (u, v) и вычислить соответствующую сетку в (x, y). Сетка должна быть достаточно мелкой, чтобы обеспечить точность. Затем для данных x и y вам нужно найти четырехугольник, которому они принадлежат, и получить u и v, например, с помощью билинейной интерполяции, вычислив пересечение горизонтали со сторонами, а затем пересечение с вертикалью.

Чтобы ускорить поиск содержащих тайлов, вы можете использовать ограничивающие рамки и хранить их в дереве интервалов. Возможно также выполнить поиск ближайшей вершины (с помощью kD-дерева) и поиск охватывающего ее четырехугольника в соседних плитках.

Все это довольно технично.


Если ваша цель состоит в том, чтобы просто предоставить триангуляцию с (u, v) информацией, доступной в вершинах, достаточно создать сетку, как описано выше.

person Yves Daoust    schedule 24.04.2018
comment
Оба ваших комментария дали мне много советов. Я задался вопросом: если мы предположим, что путь AB и путь CD являются разными функциями, путь, который пересекает форму, будет похож на свертку двух функций или что-то, на что влияют две функции. проходит (0.u,0.v) точек и сначала получает сетку. - person andkspark; 24.04.2018
comment
@andkspark: я сказал это дважды: еноты. - person Yves Daoust; 24.04.2018
comment
Да, кажется, это то, что я ищу. Спасибо еще раз :) - person andkspark; 24.04.2018