Une étape de transformation affine pour la rotation autour d'un point?
Comment puis-je faire un Core Graphique transformation affine pour la rotation autour d'un point x,y de l'angle a, en utilisant un seul appel à CGAffineTransformMake() plus de mathématiques.h fonctions trigonométriques telles que sin(), cos(), etc., et pas d'autre CG appels.
D'autres réponses ici semblent être, sur l'utilisation de multiples empilées les transformations ou multi-étape transforme pour déplacer, faire pivoter et se déplacer, à l'aide de plusieurs Graphiques de Base des appels. Ces réponses ne répondent pas à mes besoins spécifiques.
- Pourquoi avez-vous besoin d'un seul appel à
CGAffineTransformMake()
? La pile d'appels de produire les mêmes résultats, sauf qu'ils le fassent en sorte que la lisibilité et de sens. Si vous voulez vraiment le faire en un seul appel, vous êtes juste de finir de reproduire le même mathématiques utilisés dans la pile d'appels, pour absolument pas en bénéficier. - Quelles sont les exigences que cela pourrait être? Vous pouvez combiner ces "empilés" les transformations dans un CGAffineTransform à l'aide de CGAffineTransformConcat. Le résultat sera le même que les formules pour les composants individuels, et les calculs impliqués sera de même en interne, ou peut-être plus optimisé dans le cas de CGAffineTransformConcat.
- Je veux la matrice des équations à utiliser sur une correspondance, mais non graphique du modèle objet dans un autre (pas nécessairement Euclidienne) géométriques de l'espace 2D.
- Peut-être ajouter des détails au sujet de vos "besoins" encouragerait plus d'aide de la communauté. "Empilés" les transformations sont plus lisibles, ce qui est généralement préféré.
- C'est un peu inutile de dire que les réponses ne répondent pas à vos exigences, sans mentionner vos exigences.
- Voir la accepté de répondre pour les détails requis: le sinus et le cosinus équations nécessaires pour une étape de transformation, qui peut être efficacement utilisé pour calculer directement les emplacements de multiples points dans un 2D modèle physique en dehors de tout contexte graphique, ainsi que la rotation de l'image dans le contexte graphique pour correspondre exactement. La lisibilité n'était pas parmi mes exigences énoncées.
Vous devez vous connecter pour publier un commentaire.
Une rotation d'angle a autour du point (x,y) correspond à la transformation affine:
Vous pouvez avoir besoin de plug-in-a la place d'une fonction que vous voulez que la rotation dans le sens horaire ou antihoraire. Aussi, vous devrez peut-être branchez -y, au lieu de y en fonction de si oui ou non votre système de coordonnées est à l'envers.
Aussi, vous pouvez accomplir exactement la même chose en trois lignes de code à l'aide de:
Si vous étiez à l'application de cette vue, vous pouvez aussi tout simplement utiliser une transformation de rotation via CGAffineTransformMakeRotation(a), à condition de définir l'affichage de la couche anchorPoint bien afin de refléter le point que vous voulez faire pivoter autour de. Cependant, est des sons, comme vous ne sont pas intéressés à l'appliquer à vue.
Enfin, si vous postulez à un non-Euclidienne 2D de l'espace, vous ne voulez pas une transformation affine à tous. Les transformations affines sont des isométries de l'espace Euclidien, ce qui signifie qu'ils préservent la norme Euclidienne distance, ainsi que les angles. Si votre espace n'est pas Euclidienne, puis la transformation que vous voulez ne peut pas réellement être affine, ou si elle est affine, la matrice de rotation peut ne pas être aussi simple que ce que j'ai écrit ci-dessus avec sin et cos. Par exemple, si vous étiez dans un espace hyperbolique, vous pourriez avoir besoin d'utiliser les fonctions trigonométriques hyperboliques sinh et cosh, avec différents signes + et - dans la formule.
P. S. je voulais aussi rappeler la lecture de ce jour que "affine" est prononcé avec une courte "un", comme dans "demander", un "a" comme dans "pouvoir". J'ai même entendu des employés d'Apple mal prononcé dans leur parle de la WWDC.
Pour ceux qui, comme moi, qui sont en difficulté dans la recherche d'une solution complète pour faire pivoter une image et de le dimensionner correctement, afin de remplir les contenant cadre, après une couple d'heures, c'est le plus complet et impeccable solution que j'ai obtenu.
L'astuce ici est de traduire le point de référence, avant toute trasformation en cause (à la fois l'échelle et la rotation). Après cela, vous avez pour concaténer les deux transformer pour obtenir une complète transformation affine.
J'ai emballé à l'ensemble de la solution dans un CIFilter sous-classe que vous pouvez gist ici.
À la suite de la partie pertinente de code:
pour Swift 4
Consultez ce lien: Rotation d'un iPhone de Vue Autour d'un Point. Il peut vous aider. Vers le bas de l'article, il y a une section intitulée "Modifier le Point d'Ancrage". C'est probablement le plus adapté à vos besoins, même si il y a une certaine compensation qui doit être fait afin de ne pas décaler la vue.
Utiliser la vue du calque et de point d'ancrage. par exemple,