NSAffineTransform — bu nədir, transformasiya növləri və necə tətbiq edilir

Müəllif: IT Sectr Dərc olunub: 2026-07-22 Oxuma vaxtı: 9 dəq

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 — macOS-da 3×3 matrisi ilə afin çevirmələr üçün AppKit sinifi
  • Afin çevirmə xətlərin paralelliyini qoruyur, lakin məsafələri və bucaqları dəyişə bilər
  • Əsas əməliyyatlar: translate (yerdəyişmə), scale (miqyaslama), rotate (fırlama), shear (əyilmə)
  • Çevirmələr matris vurulması ilə birləşdirilir — əməliyyatların sırası nəticəyə təsir edir
  • NSAffineTransform nöqtələrə, ölçülərə, yollara və Core Graphics qrafik kontekstinə tətbiq olunur

NSAffineTransform nədir?

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).

Afin çevirmə növləri

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əliyyatNSAffineTransform metoduParametriVizual effekt
TranslatetranslateXBy:yBy:deltaX, deltaYObyektin X və Y oxları boyunca yerdəyişməsi
ScalescaleBy: / scaleXBy:yBy:factor / scaleX, scaleYÖlçülərin artırılması və ya azaldılması
RotaterotateByDegrees: / rotateByRadians:dərəcə və ya radianla bucaqKoordinat başlanğıcı ətrafında fırlama
ShearsetTransformStruct vasitəsiləmatrisin m12, m21 komponentləriObyektin ox boyunca əyilməsi

Translate — yerdəyişmə

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 — miqyaslama

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 — fırlama

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.

3×3 matris təsviri

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. tXtY 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.

Çevirmələrin birləşdirilməsi

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.

Obyektlərə və kontekstə tətbiqi

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:set.

Nöqtələrin və ölçülərin transformasiyası

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.

NSBezierPath yollarının transformasiyası

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.

Qrafik kontekstə tətbiq

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.

Swift dilində kod nümunələri

Praktik nümunələri macOS tətbiqində qrafik obyektlərin transformasiyası üçün NSAffineTransform istifadəsinə baxaq.

Çevirmələrin yaradılması və birləşdirilməsi

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.

swift
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)

Çəkmə üçün kontekst transformasiyası

Nümunə NSAffineTransform-un qrafik kontekstinə setconcat 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.

swift
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()
}

NSBezierPath yolunun transformasiyası

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.

swift
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 CGAffineTransform-dan nə ilə fərqlənir?

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.

Obyekti onun mərkəzi ətrafında necə fırlatmaq olar?

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.

NSAffineTransform-dan iOS-da istifadə etmək olar?

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.

Çevirməni necə ləğv etmək olar?

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.

Güzgü əksini necə yaratmaq olar?

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ə

  • NSAffineTransform — macOS-da 3×3 matrisi ilə afin çevirmələr üçün AppKit sinifi
  • Dörd əsas növ: translate (yerdəyişmə), scale (miqyaslama), rotate (fırlama) və shear (əyilmə)
  • 3×3 matris altı əhəmiyyətli komponentdən ibarətdir: m11, m12, m21, m22, tX, tY
  • Çevirmələrin birləşdirilmə ardıcıllığı nəticəyə təsir edir — matris vurulması kommutativ deyil
  • NSPoint, NSSize, NSBezierPath və CTM vasitəsilə qrafik kontekstinə tətbiq olunur
  • Tərs çevirmə invert metodu ilə istənilən afin transformasiyanı ləğv edir
  • iOS-da analoqu Core Graphics-dən CGAffineTransform strukturudur

Aç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.

Layihəni müzakirə et

Həm də oxuyun