Для числа преобразований, которые вы смотрите на грубую силу, это, вероятно, самый простой подход, а не пытаться делать какой-либо математический анализ вещей (я не уверен на 100%, если это вообще возможно, но это будет очень сложно).
Для трех различных преобразований (A, B, C) у вас есть шесть различных способов их применения.Это:
Таким образом, для каждого из них примените их в указанном порядке к вашему входу и проверьте, соответствует ли конечный продукт вашему выходу.
Если у вас нет одного из конкретных преобразований, тогда у вас останется только два варианта заказа.Это может быть лучше всего решено, просто используя вышеупомянутые шесть вариантов и применяя матрицу тождества (или не-опцию), где отсутствует пропущенное преобразование.Конечно, вам также нужны проверки, чтобы предотвратить дублирование одного и того же порядка преобразования.
Для оптимальной производительности не обязательно проверять все точки в вашем массиве - если первая точка не совпадает, то нетнужно проверить больше.Вы, конечно, захотите проверить все точки в массиве на предмет совпадения, чтобы убедиться, что первая точка, которая преобразована, работает, не случайно.Также вы можете проверить наличие тривиальных преобразований (таких как масштабирование с коэффициентом 1) и рассматривать их как несуществующие, поскольку они могут появляться в любой позиции вообще, поэтому вы можете также предположить, что они находятся в начале (или в конце, или в середине).предпочтение).
Наконец, все еще существует возможность двусмысленности.это не очень вероятно, и даже с небольшим набором входных точек это становится очень маловероятным.Это точка, которую вы должны знать, хотя.Также см. Ниже обсуждение специального случая, когда двусмысленность становится намного более вероятной.
Я надеюсь, что этого достаточно, чтобы вы пошли в правильном направлении.Я не могу написать полный код, потому что понятия не имею, как хранятся ваши данные преобразования и т. Д.
После небольшого обсуждения того, является ли определенный перевод коммутативным или нет (например, выполняет ли A, а затем B то же, что иделаю б то а) я считаю что их нет.В особом случае, когда масштабирование X и Y равно, тогда масштабирование и вращение являются коммутативными, но используемый здесь синтаксис предполагает, что масштабирование имеет два фактора, которые, как я полагаю, являются масштабными коэффициентами X и Y.Это означает, что в этом случае масштабирование и вращение не являются коммутативными.Переводы никогда не бывают коммутативными (представьте себе тривиальный случай, когда перевод переместит точку в начало координат, и вы увидите, что это имеет значение).
Точка Ноктурна (в комментариях) о коммутативности действительно применима, хотя, если масштабто же самое по осям X и Y.Это означает, что если у вас есть такой масштаб, и он находится рядом с вращением, то вы получите два возможных заказа трансформации, которые действительны.Не будет никакой возможности различить эти два.