NSAffineTransform — bu nima, transformatsiya turlari va qanday qo'llash

Muallif: IT Sectr Nashr etilgan: 2026-07-22 O'qish vaqti: 9 daq

NSAffineTransform — bu AppKit (macOS) dan ikki o'lchovli grafikada affin o'zgartirishni ifodalovchi sinfdir. U 3×3 o'lchamli matritsani inkapsulyatsiya qiladi, bu koordinatalarning siljishi, masshtablanishi, aylanishi va qiyshayishi kombinatsiyasini tavsiflaydi. Apple Documentation (2026) ma'lumotlariga ko'ra, NSAffineTransform Core Graphics da yo'llar, nuqtalar va macOS dagi grafik kontekstlarni transformatsiya qilish uchun keng qo'llaniladi.

Asosiy ma'lumotlar

  • NSAffineTransform — macOS da 3×3 matritsali affin o'zgartirishlar uchun AppKit sinfi
  • Affin o'zgartirish chiziqlarning parallelligini saqlaydi, lekin masofalar va burchaklarni o'zgartirishi mumkin
  • Asosiy operatsiyalar: translate (siljish), scale (masshtablash), rotate (aylantirish), shear (qiyshaytirish)
  • Transformatsiyalar matritsalarni ko'paytirish orqali birlashtiriladi — operatsiyalar tartibi natijaga ta'sir qiladi
  • NSAffineTransform nuqtalar, o'lchamlar, yo'llar va Core Graphics grafik kontekstiga qo'llaniladi

NSAffineTransform nima?

NSAffineTransform — bu faqat macOS da mavjud bo'lgan AppKit ramkasidan sinfdir. U 3×3 matritsa orqali ikki o'lchovli fazoda affin o'zgartirishni ifodalaydi. Core Graphics dan CGAffineTransform dan (iOS da mavjud) farqli o'laroq, NSAffineTransform CGAffineTransform strukturasining ob'ektga yo'naltirilgan o'ramidir va NSBezierPath, NSPoint va NSSize bilan ishlash uchun qulay metodlar qo'shadi.

Affin o'zgartirish — bu tekislikning shunday o'zgartirishidirki, u «nuqta to'g'ri chiziqda yotadi» munosabatini va chiziqlarning parallelligini saqlaydi. Boshqacha aytganda, affin o'zgartirishdan so'ng parallel chiziqlar parallel qoladi, to'g'ri chiziqlar esa to'g'ri qoladi. Biroq masofalar, burchaklar va maydonlar o'zgarishi mumkin: masshtablash, aylantirish va qiyshaytirish affin o'zgartirishlarning xususiy holatlaridir.

iOS da NSAffineTransform ning analogi Core Graphics dan CGAffineTransform strukturasidir. Ikkala API ham bir xil matematik modelga — oxirgi qatori har doim [0, 0, 1] bo'lgan 3×3 affin o'zgartirish matritsasiga asoslanadi. Farq shundaki, NSAffineTransform sinf (Objective-C da retain/release bilan), CGAffineTransform esa Swift va C da strukturadir (qiymat turi).

Affin o'zgartirish turlari

NSAffineTransform to'rtta asosiy o'zgartirish turini qo'llab-quvvatlaydi: translate (siljish), scale (masshtablash), rotate (aylantirish) va shear (qiyshaytirish). Har bir tur alohida metod bilan ifodalanadi va mavjud transformatsiya ob'ektiga qo'llanishi yoki yangisini yaratish uchun ishlatilishi mumkin.

OperatsiyaNSAffineTransform metodiParametrlarVizual effekt
TranslatetranslateXBy:yBy:deltaX, deltaYOb'ektning X va Y o'qlari bo'ylab siljishi
ScalescaleBy: / scaleXBy:yBy:factor / scaleX, scaleYO'lchamlarni kattalashtirish yoki kichiklashtirish
RotaterotateByDegrees: / rotateByRadians:gradus yoki radianda burchakKoordinatalar boshi atrofida aylantirish
ShearsetTransformStruct orqalimatritsaning m12, m21 komponentlariOb'ektning o'q bo'ylab qiyshayishi

Translate — siljish

Translate ob'ektning barcha nuqtalari koordinatalariga siljish qo'shadi. deltaX va deltaY parametrlari mos ravishda gorizontal va vertikal siljish miqdorini aniqlaydi. Ijobiy deltaX qiymati o'ngga, deltaY esa yuqoriga siljitadi. Translate ob'ektning shakli yoki o'lchamini o'zgartirmaydi — faqat uning holatini.

Scale — masshtablash

Scale nuqtalar koordinatalarini berilgan koeffitsientga ko'paytiradi. Bir tekis masshtablashda (bitta parametr) ob'ekt mutanosib ravishda kattalashadi yoki kichiklashadi. Notekis masshtablashda shakl buziladi. Koeffitsient 1.0 o'lchamni o'zgarishsiz qoldiradi, 1.0 dan katta kattalashtiradi, 0.0 dan 1.0 gacha kichiklashtiradi. Manfiy qiymatlar ko'zgu aksini yaratadi.

Rotate — aylantirish

Rotate ob'ektni koordinatalar boshi atrofida berilgan burchakka aylantiradi. Ijobiy aylanish burchagi soat miliga teskari aylanishga mos keladi. rotateByDegrees graduslarni (0–360), rotateByRadians radianlarni (0–2π) qabul qiladi. Aylantirish har doim (0, 0) nuqtasiga nisbatan bajariladi, shuning uchun ixtiyoriy nuqta atrofida aylantirish uchun rotate ni translate bilan birlashtirish kerak.

3×3 matritsaviy tasvirlash

Affin o'zgartirish NSAffineTransform da 3×3 matritsa bilan ifodalanadi, bu erda oxirgi qator har doim [0, 0, 1]. Bu o'zgartirishlar kombinatsiyasini matritsalar ko'paytmasi sifatida taqdim etishga imkon beruvchi standart matematik tasvirdir. Matritsa tuzilishi NSAffineTransformStruct orqali aniqlanadi, u oltita muhim komponentni o'z ichiga oladi: m11, m12, m21, m22, tX, tY.

m11, m12, m21, m22 komponentlari masshtablash, aylantirish va qiyshaytirish uchun javobgardir. tX va tY komponentlari siljish uchun javobgardir. Standart konfiguratsiyada (birlik matritsa) m11 = 1, m22 = 1, qolganlari 0. Matritsaning joriy qiymatlarini olish uchun transformStruct dan foydalaniladi — NSAffineTransformStruct strukturasini qaytaruvchi NSAffineTransform xususiyati.

Matritsalarni ko'paytirish kommutativ bo'lmagan operatsiyadir. Bu shuni anglatadiki, o'zgartirishlarni qo'llash tartibi muhim: translate + rotate rotate + translate dan farqli natija beradi. Birlashtirishda NSAffineTransform yangi matritsani chapdan joriy matritsaga ko'paytiradi: newMatrix = operation × currentMatrix. Shuning uchun oxirgi qo'shilgan o'zgartirish birinchi bo'lib qo'llaniladi.

Transformatsiyalarni birlashtirish

NSAffineTransform bir nechta o'zgartirishlarni bitta ob'ektda birlashtirishga imkon beradi. Har bir translateXBy:yBy:, scaleBy: yoki rotateByDegrees: chaqiruvi ichki matritsani o'zgartiradi — joriy matritsani tegishli o'zgartirish matritsasiga ko'paytiradi. Bu oddiy operatsiyalar ketma-ketligidan murakkab o'zgartirish yaratishga imkon beradi.

Birlashtirilgan o'zgartirishni teskari qilish uchun invert metodi ishlatiladi. Teskari o'zgartirish asl nusxani bekor qiluvchi yangi affin o'zgartirish yaratadi: nuqtaga asl o'zgartirishni, so'ngra teskari o'zgartirishni qo'llasak, nuqta boshlang'ich holatiga qaytadi. Teskari o'zgartirish transformatsiya qilinmasligi kerak bo'lgan UI elementlarini chizishdan oldin kontekst transformatsiyasini bekor qilish uchun foydalidir.

O'zgartirishning ayniyat (koordinatalarni o'zgartirmaydi) ekanligini isIdentity xususiyati orqali tekshirish mumkin. Ayniyat o'zgartirish birlik matritsadir, unga ko'paytirilganda nuqtaning koordinatalari o'zgarmaydi. Yangi NSAffineTransform ob'ekti ayniyat o'zgartirish sifatida yaratiladi. Bu xususiyat optimallashtirish uchun foydalidir: agar o'zgartirish ayniyat bo'lsa, uni qo'llashni o'tkazib yuborish mumkin.

Ob'ektlar va kontekstga qo'llash

NSAffineTransform to'rt turdagi ob'ektlarga qo'llanishi mumkin: NSPoint, NSSize, NSBezierPath va NSGraphicsContext grafik konteksti. Har bir maqsad uchun alohida metod mavjud: transformPoint:, transformSize:, transformBezierPath: va set.

Nuqtalar va o'lchamlarni transformatsiya qilish

Metod transformPoint: o'zgartirish matritsasini nuqtaning koordinata vektoriga (x, y, 1) ko'paytirib, yangi nuqta holatini qaytaradi. transformSize: o'xshash ishlaydi, lekin tX va tY komponentlarini hisobga olmaydi — siljish qo'llanilmaydi, faqat masshtablash, aylantirish va qiyshaytirish qo'llaniladi. Bu siljimasligi kerak bo'lgan vektorlar va o'lchamlarni transformatsiya qilish uchun foydalidir.

NSBezierPath yo'llarini transformatsiya qilish

Metod transformBezierPath: har bir nuqtasi NSAffineTransform matritsasiga muvofiq o'zgartirilgan yangi NSBezierPath ob'ektini yaratadi. Asl yo'l o'zgarmaydi — o'zgartirilgan koordinatalar bilan nusxa yaratiladi. Bu ko'p sonli tugunlari bo'lgan murakkab yo'llar uchun qimmat operatsiyadir.

Grafik kontekstga qo'llash

Metod set o'zgartirishni joriy grafik kontekstga (NSGraphicsContext) qo'llaydi, uning CTM (Current Transformation Matrix) ni o'zgartiradi. set chaqirilgandan so'ng, ushbu kontekstdagi barcha keyingi chizmalar o'zgartiriladi. Vaqtinchalik o'zgartirish uchun set dan oldin va keyin saveGraphicsState / restoreGraphicsState dan foydalaning.

Swift da kod misollari

Keling, macOS ilovasida grafik ob'ektlarni transformatsiya qilish uchun NSAffineTransform dan foydalanishning amaliy misollarini ko'rib chiqaylik.

O'zgartirishlarni yaratish va birlashtirish

Misol siljish, aylantirish va masshtablashni birlashtirgan NSAffineTransform yaratadi. Avval ob'ekt (100, 50) ga siljiydi, so'ngra 45 gradusga aylanadi va nihoyat 1.5 marta kattalashadi. Tartib muhim: translate dan keyin rotate koordinatalarning yangi boshiga nisbatan aylanishni beradi.

swift
import AppKit

let transform = NSAffineTransform()
transform.translateXBy(100, yBy: 50)
transform.rotateByDegrees(45)
transform.scaleBy(1.5)

// Nuqtaga qo'llash
let point = NSPoint(x: 10, y: 20)
let transformedPoint = transform.transform(point)

// O'lchamga qo'llash
let size = NSSize(width: 100, height: 50)
let transformedSize = transform.transform(size)

Chizish uchun kontekst transformatsiyasi

Misol NSAffineTransform ni grafik kontekstga set va concat orqali qo'llashni ko'rsatadi. Transformatsiya qo'llanilgandan so'ng, barcha keyingi chizmalar o'zgartirilgan koordinatalar tizimida amalga oshiriladi. saveGraphicsState orqali grafik holatini saqlash asl matritsaga qaytish imkonini beradi.

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

    // O'zgartirilgan koordinatalar tizimida chizish
    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 yo'lini transformatsiya qilish

Misol o'zgartirilgan koordinatalar bilan NSBezierPath nusxasini yaratishni ko'rsatadi. Asl yo'l o'zgarmay qoladi, o'zgartirilgan nusxa esa alohida chizilishi mumkin — bu turli holatlarda takrorlanuvchi elementlarni yaratish uchun foydalidir.

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 beriladigan savollar

NSAffineTransform CGAffineTransform dan nimasi bilan farq qiladi?

NSAffineTransform — bu AppKit dan sinf (faqat macOS), CGAffineTransform esa Core Graphics dan struktura (iOS va macOS). NSAffineTransform ob'ektga yo'naltirilgan o'ramdir va NSBezierPath bilan ishlash uchun metodlarni taqdim etadi. CGAffineTransform CGPath bilan ishlatiladigan engil qiymat turidagi strukturadir.

Ob'ektni uning markazi atrofida qanday aylantirish mumkin?

Markaz atrofida aylantirish uchun uch qadamni bajaring: 1) ob'ekt markaziga translate (koordinatalar boshini markazga siljitish), 2) kerakli burchakka rotate, 3) markazning manfiy vektoriga translate bilan orqaga qaytish. translate—rotate—translate kombinatsiyasi koordinatalar boshi atrofida emas, balki ixtiyoriy nuqta atrofida aylanishni beradi.

NSAffineTransform dan iOS da foydalanish mumkinmi?

Yo'q, NSAffineTransform faqat macOS da AppKit tarkibida mavjud. iOS da Core Graphics dan CGAffineTransform strukturasidan foydalaniladi, u o'xshash imkoniyatlarni taqdim etadi: CGAffineTransformMakeTranslation, CGAffineTransformMakeScale, CGAffineTransformMakeRotation va CGAffineTransformConcat.

O'zgartirishni qanday bekor qilish mumkin?

invert metodi dan foydalaning, u teskari o'zgartirishni qaytaradi. Asl o'zgartirishni teskari bilan ko'paytirsak, birlik matritsa (ayniyat o'zgartirish) olinadi. Vaqtinchalik qo'llash uchun set dan oldin saveGraphicsState va keyin restoreGraphicsState ni chaqiring.

Ko'zgu aksini qanday yaratish mumkin?

Manfiy masshtabdan foydalaning: transform.scaleXBy(-1, yBy: 1) gorizontal ko'zgu, scaleXBy(1, yBy: -1) esa vertikal ko'zgu yaratadi. Ixtiyoriy o'qqa nisbatan ko'zgu uchun translate (o'qqa siljish), scale ni -1 bilan va teskari translate ni birlashtiring.

Xulosa

  • NSAffineTransform — macOS da 3×3 matritsali affin o'zgartirishlar uchun AppKit sinfi
  • To'rtta asosiy tur: translate (siljish), scale (masshtablash), rotate (aylantirish) va shear (qiyshaytirish)
  • 3×3 matritsa oltita muhim komponentni o'z ichiga oladi: m11, m12, m21, m22, tX, tY
  • Transformatsiyalarni birlashtirish tartibi natijaga ta'sir qiladi — matritsalarni ko'paytirish kommutativ emas
  • NSPoint, NSSize, NSBezierPath va CTM orqali grafik kontekstga qo'llaniladi
  • Teskari o'zgartirish invert metodi orqali har qanday affin o'zgartirishni bekor qiladi
  • iOS da analogi Core Graphics dan CGAffineTransform strukturasidir

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing