Ordre de transformation masortingce / coordonnée

J’ai deux tableaux de points:

Point [] original; AND Point [] transformed;

Ce tableau transformé est simplement une copie de l’original avec les transformations appliquées. Exemple:

 masortingx.Rotate(5f); masortingx.Scale(.8f, 1.1f); masortingx.Translate(30f, 18f); masortingx.TransformPoints(transformed); 
  • Les points d’origine sont connus.
  • Les valeurs de transformation sont connues.
  • L’ordre dans lequel les transformations ont été appliquées n’est PAS connu.

Comment puis-je calculer / déduire l’ordre des transformations?

MODIFIER

  • Il n’y a qu’un tour de transformation.
  • Un tour peut contenir au plus trois transformations comme ci-dessous.
  • Les seules transformations appliquées sont les combinaisons rotation, mise à l’échelle et translation.

Pour lui donner un contexte réel, envisagez d’avoir une image avec des points d’intérêt connus. Vous imprimez l’image, numérisez-la et essayez de la relire. L’image contient des marqueurs d’orientation qui me permettent de calculer les transformations appliquées lors du processus de numérisation.

Maintenant, une approche de force brute serait:

  1. Lire une image numérisée.
  2. Calculer la rotation sur l’image numérisée.
  3. Appliquez une rotation sur l’image numérisée.
  4. Calculez l’échelle sur l’image pivotée.
  5. Appliquez l’échelle sur l’image pivotée.
  6. Calculer la traduction sur l’image mise à l’échelle.
  7. Appliquer la traduction sur l’image mise à l’échelle.

Vous pouvez maintenant lire les points d’intérêt de l’image traitée en utilisant les points d’origine comme s’il n’y avait pas de transformation. Bien sûr cette méthode est chère. Une image de 500 Mo doit avoir au moins deux copies en mémoire à la fois et doit être transformée à l’aide de l’object graphique.

Le principe de cette question était de lire l’image une seule fois, de calculer toutes les transformations et de les appliquer aux coordonnées plutôt qu’à l’image elle-même. Utilisez les coordonnées transformées pour lire les points d’intérêt. C’est là que le problème de «l’ordre des transformations» entre en jeu. Quelques réponses très utiles ci-dessous et j’espère que cela clarifie le contexte.

Car le nombre de transformations que vous envisagez d’utiliser la force brute est probablement l’approche la plus facile plutôt que d’essayer de faire des parsings mathématiques sur des choses (je ne suis pas sûr à 100% si c’est même possible mais ce serait très difficile).

Pour trois transformations différentes (A, B, C), vous avez six façons différentes de les appliquer. Elles sont:

  • abc
  • ACB
  • BAC
  • BCA
  • TAXI
  • CBA

Donc, pour chacun de ceux-ci, appliquez-les dans votre ordre à votre entrée et vérifiez si le produit final correspond à votre sortie.

Si vous ne possédez pas l’une des transformations spécifiques, il ne vous rest que deux options d’ordre. Pour résoudre ce problème, utilisez simplement les six options ci-dessus et appliquez une masortingce d’identité (ou non-op) là où se trouve la transformation manquante. Bien sûr, vous avez également besoin de contrôles pour vous empêcher de dupliquer le même ordre de transformation.

Pour des performances optimales, vous n’avez pas nécessairement besoin de vérifier tous les points de votre tableau. Si le premier point ne correspond pas, inutile de vérifier davantage. Vous voudrez bien sûr vérifier tous les points du tableau pour tous ceux qui correspondent, afin de vous assurer que ce n’est pas un hasard si le premier point transformé a fonctionné. Vous pouvez également vérifier les transformations sortingviales (telles que l’échelle par un facteur 1) et les traiter comme inexistantes, car elles peuvent apparaître à n’importe quel emplacement. préférence).

Enfin, il y a encore une possibilité d’ambiguïté. ce n’est pas très probable et même avec un petit nombre de points d’entrée, cela devient très improbable. C’est un point dont vous devez être conscient cependant. Voir également ci-dessous une discussion sur les cas particuliers dans lesquels l’ambiguïté devient beaucoup plus probable.

J’espère que cela suffit pour que vous alliez dans la bonne direction. Je ne peux pas écrire le code complet car je ne sais pas du tout comment vos données de transformation sont stockées.

Après une brève discussion sur le fait de savoir si certaines traductions sont commutatives ou non (p. Ex., Faire A alors B est-il identique à faire B puis A), je crois qu’elles ne le sont pas. Dans le cas particulier où les échelles de X et Y sont égales, l’échelle et la rotation sont commutatives, mais la syntaxe utilisée ici suggère que l’échelle a deux facteurs que je présume être des facteurs d’échelle X et Y. Cela signifie que la mise à l’échelle et la rotation ne sont pas commutatives dans ce cas. Les traductions ne sont jamais commutatives (imaginez le cas sortingvial où une traduction déplacerait le point vers l’origine et vous pourrez voir que c’est important).

Le sharepoint Nocturn (dans les commentaires) sur la commutativité s’applique bien si l’échelle est la même sur les axes X et Y. Cela signifie que si vous avez une telle échelle et qu’elle est adjacente à une rotation, vous obtiendrez deux ordres de transformation possibles valides. Il n’y aura aucun moyen de faire la distinction entre les deux.

Dans CG, il est assez courant de conserver une Stack masortingce, c’est-à-dire que chaque fois que vous effectuez une opération sur la masortingce (transformation, rotation ou mise à l’échelle), vous placez la nouvelle masortingce sur une stack. De cette façon, vous pouvez retrouver votre état d’origine.