Comme vous le savez probablement, Apple fournit un tas de fonctionnalités pour la manipulation des objets dans l'espace 2D en utilisant CGAffineTransform. Curieusement, Apple ne vous fournit pas un moyen d'extraire l'échelle, de transformer et d'informations de rotation d'un CGAffineTransform et ils ne fournissent pas toute la fonctionnalité de cisaillement à tous.
Voici quelques fonctions supplémentaires en ligne que j'utilise. Cela ajoute la capacité d'extraire les valeurs des composants de l'CGAffineTransform et ajoute également la possibilité de créer et d'extraire des informations de cisaillement.
Comme toujours, ce code est libre d'utiliser sans restriction ni limitation, mais a aucune garantie. Si vous fixez un bug, n'hésitez pas à me le faire savoir sur le correctif afin que je puisse intégrer le correctif.
Voici quelques fonctions supplémentaires en ligne que j'utilise. Cela ajoute la capacité d'extraire les valeurs des composants de l'CGAffineTransform et ajoute également la possibilité de créer et d'extraire des informations de cisaillement.
Comme toujours, ce code est libre d'utiliser sans restriction ni limitation, mais a aucune garantie. Si vous fixez un bug, n'hésitez pas à me le faire savoir sur le correctif afin que je puisse intégrer le correctif.
#ifndef __MCP_AFFINE_TRANSFORM_ADDITIONS__ #define __MCP_AFFINE_TRANSFORM_ADDITIONS__ #import <CoreGraphics/CoreGraphics.h> #ifdef __cplusplus extern "C" { #endif #define degreesToRadian(x) (M_PI * x / 180.0) #define radiansToDegrees(x) (180.0 * x / M_PI) static inline CGAffineTransform CGAffineTransformMakeShear(CGFloat shearX, CGFloat shearY) { return CGAffineTransformMake(1.f, shearY, shearX, 1.f, 0.f, 0.f); } static inline CGAffineTransform CGAffineTransformShear(CGAffineTransform transform, CGFloat shearX, CGFloat shearY) { CGAffineTransform sheared = CGAffineTransformMakeShear(shearX, shearY); return CGAffineTransformConcat(transform, sheared); } static inline CGFloat CGAffineTransformGetDeltaX(CGAffineTransform transform) {return transform.tx;}; static inline CGFloat CGAffineTransformGetDeltaY(CGAffineTransform transform) {return transform.ty;}; static inline CGFloat CGAffineTransformGetScaleX(CGAffineTransform transform) {return sqrtf( (transform.a * transform.a) + (transform.c * transform.c) );}; static inline CGFloat CGAffineTransformGetScaleY(CGAffineTransform transform) {return sqrtf( (transform.b * transform.b) + (transform.d * transform.d) );}; static inline CGFloat CGAffineTransformGetShearX(CGAffineTransform transform) {return transform.b;}; static inline CGFloat CGAffineTransformGetShearY(CGAffineTransform transform) {return transform.c;}; static inline CGFloat CGPointAngleBetweenPoints(CGPoint first, CGPoint second) { CGFloat dy = second.y - first.y; CGFloat dx = second.x - first.x; return atan2f(dy, dx); } static inline CGFloat CGAffineTransformGetRotation(CGAffineTransform transform) { // No exact way to get rotation out without knowing order of all previous operations // So, we'll cheat. We'll apply the transformation to two points and then determine the // angle betwen those two points CGPoint testPoint1 = CGPointMake(-100.f, 0.f); CGPoint testPoint2 = CGPointMake(100.f, 0.f); CGPoint transformed1 = CGPointApplyAffineTransform(testPoint1, transform); CGPoint transformed2 = CGPointApplyAffineTransform(testPoint2, transform); return CGPointAngleBetweenPoints(transformed1, transformed2); } #ifdef __cplusplus } #endif #endif
Aucun commentaire:
Enregistrer un commentaire