Una rotazione di un angolo intorno al punto (x, y) corrisponde alla trasformazione affine:
CGAffineTransform transform = CGAffineTransformMake(cos(a),sin(a),-sin(a),cos(a),x-x*cos(a)+y*sin(a),y-x*sin(a)-y*cos(a));
potrebbe essere necessario collegare in -a invece di una seconda se si desidera che la rotazione sia in senso orario o antiorario. Inoltre, potrebbe essere necessario inserire -y anziché y a seconda che il sistema di coordinate sia capovolto o meno.
Inoltre, è possibile eseguire esattamente la stessa cosa in tre righe di codice utilizzando:
CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, a);
transform = CGAffineTransformTranslate(transform,-x,-y);
Se si dovesse applicando questo per una vista, si potrebbe anche usare semplicemente una rotazione trasformare tramite CGAffineTransformMakeRotation (a), a condizione di impostare la proprietà anchorPoint del livello della vista per riflettere il punto che si desidera ruotare. Tuttavia, sembra che tu non sia interessato ad applicarlo a una vista.
Infine, se lo si applica a uno spazio 2D non Euclideo, è possibile che non si desideri affatto una trasformazione affine. Le trasformazioni affini sono isometrie dello spazio euclideo, nel senso che conservano la distanza euclidea standard, nonché gli angoli. Se il tuo spazio non è euclideo, allora la trasformazione che desideri potrebbe non essere effettivamente affine, o se è affine, la matrice per la rotazione potrebbe non essere semplice come quello che ho scritto sopra con peccato e cos. Ad esempio, se ti trovi in uno spazio iperbolico, potresti dover utilizzare le funzioni trigonometriche iperboliche sinh e cosh, insieme a diversi segni + e - nella formula.
P.S. Volevo anche ricordare a chiunque abbia letto fino a questo punto che "affine" è pronunciato con un breve "a" come in "ask", non un lungo "a" come in "able". Ho persino sentito i dipendenti di Apple mal pronunciarlo nei loro discorsi sul WWDC.
Perché avete bisogno di una singola chiamata a 'CGAffineTransformMake()'? Le chiamate in pila producono esattamente gli stessi risultati, tranne che lo fanno in un modo leggibile e comprensibile.Se vuoi davvero farlo in una singola chiamata, finirai per replicare la stessa matematica usata nelle chiamate impilate, per non avvantaggiarti. –
Quali requisiti potrebbe essere? È possibile combinare queste trasformazioni "impilate" in un CGAffineTransform utilizzando CGAffineTransformConcat. Il risultato sarà lo stesso delle formule per i singoli componenti e i calcoli coinvolti saranno gli stessi internamente, o eventualmente più ottimizzati nel caso di CGAffineTransformConcat. – morningstar
Desidero che le equazioni di matrice vengano utilizzate su un oggetto di modello corrispondente ma non grafico in uno spazio 2D geometrico diverso (non necessariamente Euclideo). – hotpaw2