NSAffineTransform — bu AppKit-dən (macOS) ikiölçülü qrafikada afin çevirməni təmsil eden sinifdir. O, 3×3 ölçülü matrisi inkapsulyasiya edir. Bu matris koordinatların yerdəyişməsi, miqyaslanması, fırlanması və əyilməsi kombinasiyasını təsvir edir. Apple Documentation (2026) məlumatına görə, NSAffineTransform Core Graphics-də yolların, nöqtələrin və macOS-də qrafik kontekstlərin transformasiyası üçün geniş istifadə olunur.
Əsas məqamlar
NSAffineTransform — bu yalnız macOS-da mövcud olan AppKit çərçivəsindən sinifdir. O, 3×3 matris vasitəsilə ikiölçülü fəzada afin çevirməni təmsil edir. Core Graphics-dən olan CGAffineTransform-dan (iOS-da mövcuddur) fərqli olaraq, NSAffineTransform CGAffineTransform strukturunun obyekt yönümlü qablaşdırmasıdır və NSBezierPath, NSPoint və NSSize ilə iş üçün rahat metodlar əlavə edir.
Afin çevirmə — bu müstəvinin elə çevirməsidir ki, “nöqtə düz xətt üzərində yerləşir” münasibətini və xətlərin paralelliyini qoruyur. Başqa sözlə, afin çevirmədən sonra paralel xətlər paralel qalır, düz xətlər isə düz qalır. Lakin məsafələr, bucaqlar və sahələr dəyişə bilər: miqyaslama, fırlama və əyilmə afin çevirmələrin xüsusi hallarıdır.
iOS-da NSAffineTransform-un analoqu Core Graphics-dən CGAffineTransform strukturudur. Hər iki API eyni riyazi modelə — sonuncu sətri həmişə [0, 0, 1] olan 3×3 afin çevirmə matrisinə əsaslanır. Fərq ondadır ki, NSAffineTransform sinifdir (Objective-C-də retain/release ilə), CGAffineTransform isə Swift və C-də strukturdur (dəyər tipi).
NSAffineTransform dörd əsas çevirmə növünü dəstəkləyir: translate (yerdəyişmə), scale (miqyaslama), rotate (fırlama) və shear (əyilmə). Hər bir növ ayrıca metodla təmsil olunur və həm mövcud transformasiya obyektinə tətbiq oluna bilər, həm də yenisini yaratmaq üçün istifadə edilə bilər.
| Əməliyyat | NSAffineTransform metodu | Parametri | Vizual effekt |
|---|---|---|---|
| Translate | translateXBy:yBy: | deltaX, deltaY | Obyektin X və Y oxları boyunca yerdəyişməsi |
| Scale | scaleBy: / scaleXBy:yBy: | factor / scaleX, scaleY | Ölçülərin artırılması və ya azaldılması |
| Rotate | rotateByDegrees: / rotateByRadians: | dərəcə və ya radianla bucaq | Koordinat başlanğıcı ətrafında fırlama |
| Shear | setTransformStruct vasitəsilə | matrisin m12, m21 komponentləri | Obyektin ox boyunca əyilməsi |
Translate obyektin bütün nöqtələrinin koordinatlarına yerdəyişmə əlavə edir. deltaX və deltaY parametrləri müvafiq olaraq üfqi və şaquli yerdəyişmənin miqdarını təyin edir. Müsbət deltaX dəyəri sağa, deltaY isə yuxarı yerdəyişmə verir. Translate obyektin formasını və ölçüsünü dəyişmir — yalnız onun vəziyyətini dəyişir.
Scale nöqtələrin koordinatlarını verilən əmsala vurur. Düzgün miqyaslamada (bir parametr) obyekt mütənasib olaraq böyüyür və ya kiçilir. Qeyri-bərabər miqyaslamada forma təhrif olunur. Əmsal 1.0 ölçünü dəyişməz qoyur, 1.0-dan böyük olduqda artırır, 0.0-dan 1.0-dək olduqda azaldır. Mənfi dəyərlər güzgü əksi yaradır.
Rotate obyekti koordinat başlanğıcı ətrafında verilən bucaq qədər fırladır. Müsbət fırlama bucağı saat əqrəbinin əksinə fırlamaya uyğundur. rotateByDegrees dərəcə (0–360), rotateByRadians isə radian (0–2π) qəbul edir. Fırlama həmişə (0, 0) nöqtəsinə nisbətən aparılır, ona görə də ixtiyari nöqtə ətrafında fırlamaq üçün rotate translate ilə birləşdirilməlidir.
Afin çevirmə NSAffineTransform-da 3×3 matris ilə təsvir olunur, burada sonuncu sətr həmişə [0, 0, 1]-dir. Bu, çevirmələrin kombinasiyasını matris hasili kimi təqdim etməyə imkan verən standart riyazi təsvirdir. Matrisin strukturu altı əhəmiyyətl komponentdən ibarət NSAffineTransformStruct vasitəsilə müəyyən edilir: m11, m12, m21, m22, tX, tY.
m11, m12, m21, m22 komponentləri miqyaslama, fırlama və əyilməyə cavabdehdir. tX və tY komponentləri isə yerdəyişməyə cavabdehdir. Standart konfiqurasiyada (vahid matris) m11 = 1, m22 = 1, qalanları 0-dır. Matrisin cari dəyərlərini əldə etmək üçün NSAffineTransformStruct strukturunu qaytaran transformStruct xassəsindən istifadə olunur.
Matris vurulması kommutativ olmayan əməliyyatdır. Bu o deməkdir ki, çevirmələrin tətbiq edilmə ardıcıllığı əhəmiyyətlidir: translate + rotate rotate + translate-dən fərqli nəticə verir. Birləşdirərkən NSAffineTransform yeni matrisi soldan cariyə vurur: newMatrix = operation × currentMatrix. Buna görə də əlavə edilən son çevirmə birinci tətbiq olunur.
NSAffineTransform bir obyektdə bir neçə çevirməni birləşdirməyə imkan verir. Hər bir translateXBy:yBy:, scaleBy: və ya rotateByDegrees: çağırışı daxili matrisi dəyişdirir — cari matrisi müvafiq çevirmə matrisinə vurur. Bu, sadə əməliyyatlar ardıcıllığından mürəkkəb çevirmə yaratmağa imkan verir.
Birləşdirilmiş çevirmənin tərsi üçün invert metodu istifadə olunur. Tərs çevirmə orijinalı ləğv edən yeni afin çevirmə yaradır: nöqtəyə orijinal çevirməni, sonra isə tərsini tətbiq etsək, nöqtə ilkin vəziyyətinə qayıdır. Tərs çevirmə çevrilməməli olan UI elementlərini çəkməzdən əvvəl kontekst transformasiyasını ləğv etmək üçün faydalıdır.
Çevirmənin eynilik (koordinatları dəyişmir) olub olmadığını isIdentity xassəsi vasitəsilə yoxlamaq olar. Eynilik çevirməsi vahid matrisdir, ona vurulduqda nöqtənin koordinatları dəyişmir. Yeni NSAffineTransform obyekti eynilik çevirməsi kimi yaradılır. Bu xassə optimallaşdırma üçün faydalıdır: əgər çevirmə eynilikdirsə, onun tətbiqini buraxmaq olar.
NSAffineTransform dörd növ obyektə tətbiq oluna bilər: NSPoint, NSSize, NSBezierPath və NSGraphicsContext qrafik konteksti. Hər məqsəd üçün ayrıca metod mövcuddur: transformPoint:, transformSize:, transformBezierPath: və set.
Metod transformPoint: çevirmə matrisini nöqtənin koordinat vektoruna (x, y, 1) vuraraq yeni nöqtə vəziyyətini qaytarır. transformSize: oxşar işləyir, lakin tX və tY komponentlərini nəzərə almır — yerdəyişmə tətbiq olunmur, yalnız miqyaslama, fırlama və əyilmə tətbiq olunur. Bu, yerdəyişməməli olan vektorların və ölçülərin transformasiyası üçün faydalıdır.
Metod transformBezierPath: hər bir nöqtəsi NSAffineTransform matrisinə uyğun çevrilmiş yeni NSBezierPath obyekti yaradır. Orijinal yol dəyişmir — çevrilmiş koordinatlarla surət yaradılır. Bu, çox sayda düynü olan mürəkkəb yollar üçün bahalı əməliyyatdır.
Metod set çevirməni cari qrafik kontekstinə (NSGraphicsContext) tətbiq edir, onun CTM-ni (Current Transformation Matrix) dəyişir. set çağırıldıqdan sonra bu kontekstdəki bütün sonrakı çəkmə çevriləcək. Müvəqqəti çevirmə üçün set-dən əvvəl və sonra saveGraphicsState / restoreGraphicsState istifadə edin.
Praktik nümunələri macOS tətbiqində qrafik obyektlərin transformasiyası üçün NSAffineTransform istifadəsinə baxaq.
Nümunə yerdəyişmə, fırlama və miqyaslamanı birləşdirən NSAffineTransform yaradır. Əvvəlcə obyekt (100, 50) qədər yerdəyişir, sonra 45 dərəcə fırladılır və nəhayət 1.5 dəfə böyüdülür. Sıra əhəmiyyətlidir: translate-dən sonra rotate koordinatların yeni başlanğıcına nisbətən fırlama verir.
import AppKit
let transform = NSAffineTransform()
transform.translateXBy(100, yBy: 50)
transform.rotateByDegrees(45)
transform.scaleBy(1.5)
// Nöqtəyə tətbiq etmək
let point = NSPoint(x: 10, y: 20)
let transformedPoint = transform.transform(point)
// Ölçüyə tətbiq etmək
let size = NSSize(width: 100, height: 50)
let transformedSize = transform.transform(size)
Nümunə NSAffineTransform-un qrafik kontekstinə set və concat vasitəsilə tətbiqini göstərir. Transformasiya tətbiq edildikdən sonra bütün sonrakı çəkmə çevrilmiş koordinat sistemində aparılır. saveGraphicsState vasitəsilə qrafik vəziyyətinin saxlanması orijinal matrisə qayıtmağa imkan verir.
func drawWithTransform(in rect: NSRect) {
guard let ctx = NSGraphicsContext.current
else { return }
ctx.saveGraphicsState()
let xfm = NSAffineTransform()
xfm.translateXBy(rect.midX, yBy: rect.midY)
xfm.rotateByDegrees(30)
xfm.scaleBy(0.8)
xfm.concat()
// Dəyişdirilmiş koordinat sistemində çəkmək
let path = NSBezierPath(roundedRect: NSRect(
x: -50, y: -50,
width: 100, height: 100
), xRadius: 10, yRadius: 10)
NSColor.blue.setFill()
path.fill()
ctx.restoreGraphicsState()
}
Nümunə çevrilmiş koordinatlarla NSBezierPath-in surətinin yaradılmasını nümayiş etdirir. Orijinal yol dəyişməz qalır, çevrilmiş surət isə ayrıca çəkilə bilər — bu, müxtəlif vəziyyətlərdə təkrarlanan elementlər yaratmaq üçün faydalıdır.
func createTransformedTriangle() -> NSBezierPath {
let triangle = NSBezierPath()
triangle.move(to: NSPoint(x: 0, y: 0))
triangle.line(to: NSPoint(x: 100, y: 0))
triangle.line(to: NSPoint(x: 50, y: 100))
triangle.close()
let xfm = NSAffineTransform()
xfm.translateXBy(200, yBy: 100)
xfm.scaleXBy(1.5, yBy: 1.5)
xfm.rotateByDegrees(45)
let transformed = xfm.transform(triangle)
return transformed
}
Tez-tez verilən suallar
NSAffineTransform — bu AppKit-dən sinifdir (yalnız macOS), CGAffineTransform isə Core Graphics-dən strukturdur (iOS və macOS). NSAffineTransform obyekt yönümlü qablaşdırmadır və NSBezierPath ilə iş üçün metodlar təmin edir. CGAffineTransform CGPath ilə istifadə olunan yüngül dəyər tipli strukturdur.
Mərkəz ətrafında fırlamaq üçün üç addım yerinə yetirin: 1) obyektin mərkəzinə translate (koordinat başlanğıcını mərkəzə yerdəyişmə), 2) tələb olunan bucaqla rotate, 3) mərkəzin mənfi vektoruna translate ilə geri qayıdın. translate—rotate—translate kombinasiyası koordinat başlanğıcı ətrafında deyil, ixtiyari nöqtə ətrafında fırlama verir.
Xeyr, NSAffineTransform yalnız macOS-da AppKit tərkibində mövcuddur. iOS-da Core Graphics-dən CGAffineTransform strukturundan istifadə olunur. O, analoji imkanlar təmin edir: CGAffineTransformMakeTranslation, CGAffineTransformMakeScale, CGAffineTransformMakeRotation və CGAffineTransformConcat.
invert metodundan istifadə edin, o tərs çevirməni qaytarır. Orijinal çevirməni tərsinə vursaq, vahid matris (eynilik çevirməsi) alınır. Müvəqqəti tətbiq üçün set-dən əvvəl saveGraphicsState və sonra restoreGraphicsState çağırın.
Mənfi miqyasdan istifadə edin: transform.scaleXBy(-1, yBy: 1) üfqi əks, scaleXBy(1, yBy: -1) isə şaquli əks yaradır. İxtiyari oxa nisbətən əks üçün translate (oxa yerdəyişmə), scale -1 ilə və tərs translate birləşdirin.
Nəticə
invert metodu ilə istənilən afin transformasiyanı ləğv edirAçar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun