Faire pivoter CGPath sans changer de position
Que je veux faire tourner un CGPath
je suis en utilisant le code suivant:
CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
CGPathRef rotatedPath = CGPathCreateCopyByTransformingPath(myPath, &transform);
Ce code fonctionne bien, mais il change de chemin de position! Je veux que le chemin d'accès restent à la même position qu'il occupait avant la rotation.
source d'informationauteur Asif Mujteba
Vous devez vous connecter pour publier un commentaire.
Un chemin d'accès n'ont pas de “position”. Un chemin d'accès est un ensemble de points (définie par la ligne et la courbe de segments). Chaque point possède sa propre position.
Peut-être que vous souhaitez faire pivoter le chemin autour d'un point particulier, au lieu d'autour de l'origine. L'astuce consiste à créer une image composite de transformation qui combine trois transformations:
Par exemple, voici une fonction qui prend un chemin et retourne un nouveau chemin qui est le chemin original mis en rotation autour du centre de la boîte englobante:
Noter que cette fonction renvoie un nouveau chemin avec un +1 conserver le comte, que vous êtes responsable pour libérer lorsque vous avez terminé avec elle. Par exemple, si vous essayez de faire pivoter le chemin d'une couche de forme:
Mise à JOUR
Voici une démonstration à l'aide d'un Swift aire de jeux. Nous allons commencer avec une fonction d'aide qui affiche un chemin d'accès et les marques de l'origine avec un réticule:
Prochain, voici notre test de chemin:
(Rappelez-vous, la croix est à l'origine et ne fait pas partie du chemin que nous sommes en train de changer.)
Nous obtenons le centre et de transformer le chemin de sorte qu'il est centré à l'origine:
Puis nous la faire tourner. Tous les rotations se produire autour de l'origine:
Enfin, nous le traduire en arrière, exactement l'inversion de l'original de la traduction:
Note que nous devons inverser l'original de la traduction. Nous n'avons pas traduire par le centre de sa nouvelle boîte englobante. Rappelons que (dans cet exemple), le centre d'origine (1050,1100). Mais après que nous avons traduit de l'origine et de la rotation, la nouvelle délimitation de la zone centre est à (-25,0). La traduction de la voie (-25,0) ne sera pas le mettre n'importe où près de sa position d'origine!
Une Swift 3 méthode de rotation d'un rectangle en place autour de son centre:
Tous de rob mayoff du code de l'application de ce chemin et de sa boite continuerait de s'appliquer, de sorte que je n'ai pas voir la cause de le répéter.