NSAffineTransform — nedir, dönüşüm türleri ve nasıl uygulanır

Yazar: IT Sectr Yayınlanma: 2026-07-22 Okuma süresi: 9 dk

NSAffineTransform, iki boyutlu grafiklerde afin dönüşümü temsil eden AppKit (macOS) sınıfıdır. Koordinatların öteleme, ölçekleme, döndürme ve kesme kombinasyonunu tanımlayan 3×3 matrisi kapsüller. Apple Belgeleri'ne (2026) göre, NSAffineTransform, Core Graphics'ta macOS üzerinde yolları, noktaları ve grafik bağlamlarını dönüştürmek için yaygın olarak kullanılır.

Önemli Noktalar

  • NSAffineTransform, macOS'ta 3×3 matris ile afin dönüşümler için AppKit sınıfıdır
  • Afin dönüşüm çizgilerin paralelliğini korur ancak mesafeleri ve açıları değiştirebilir
  • Temel işlemler: translate (öteleme), scale (ölçekleme), rotate (döndürme), shear (kesme)
  • Dönüşümler matris çarpımı ile birleştirilir — işlem sırası sonucu etkiler
  • NSAffineTransform noktalara, boyutlara, yollara ve Core Graphics bağlamına uygulanır

NSAffineTransform Nedir?

NSAffineTransform, AppKit çerçevesinin bir sınıfıdır ve yalnızca macOS'ta kullanılabilir. 3×3 matris aracılığıyla iki boyutlu uzayda afin dönüşümü temsil eder. Core Graphics'taki CGAffineTransform'un (iOS'ta mevcut) aksine, NSAffineTransform, CGAffineTransform yapısı etrafında nesne yönelimli bir sarmalayıcıdır ve NSBezierPath, NSPoint ve NSSize ile çalışmak için kullanışlı yöntemler ekler.

Afin dönüşüm, “nokta bir çizgi üzerindedir” ilişkisini ve çizgilerin paralelliğini koruyan düzlemin bir dönüşümüdür. Başka bir deyişle, afin dönüşümden sonra paralel çizgiler paralel kalır ve düz çizgiler düz kalır. Ancak mesafeler, açılar ve alanlar değişebilir: ölçekleme, döndürme ve kesme, afin dönüşümlerin özel durumlarıdır.

iOS'ta, NSAffineTransform'un eşdeğeri Core Graphics'taki CGAffineTransform yapısıdır. Her iki API de aynı matematiksel modele dayanır — son satırı her zaman [0, 0, 1] olan 3×3 afin dönüşüm matrisi. Fark, NSAffineTransform'un bir sınıf (Objective-C'de retain/release ile) olması, CGAffineTransform'un ise Swift ve C'de bir yapı (değer türü) olmasıdır.

Afin Dönüşüm Türleri

NSAffineTransform dört temel dönüşüm türünü destekler: translate (öteleme), scale (ölçekleme), rotate (döndürme) ve shear (kesme). Her tür ayrı bir yöntemle temsil edilir ve mevcut bir dönüşüm nesnesine uygulanabilir veya yeni bir tane oluşturmak için kullanılabilir.

İşlemNSAffineTransform YöntemiParametrelerGörsel Efekt
TranslatetranslateXBy:yBy:deltaX, deltaYNesneyi X ve Y eksenleri boyunca kaydırır
ScalescaleBy: / scaleXBy:yBy:factor / scaleX, scaleYBoyutu büyütür veya küçültür
RotaterotateByDegrees: / rotateByRadians:derece veya radyan cinsinden açıOrijin etrafında döndürür
ShearsetTransformStruct aracılığıylaMatrisin m12, m21 bileşenleriNesneyi bir eksen boyunca eğer

Translate — Öteleme

Translate, bir nesnenin tüm noktalarının koordinatlarına bir ofset ekler. deltaX ve deltaY parametreleri sırasıyla yatay ve dikey öteleme miktarını belirler. Pozitif deltaX değeri sağa, deltaY yukarı kaydırır. Translate, nesnenin şeklini veya boyutunu değiştirmez — yalnızca konumunu değiştirir.

Scale — Ölçekleme

Scale, noktaların koordinatlarını belirli bir faktörle çarpar. Tekdüze ölçekleme (tek parametre) ile nesne orantılı olarak büyür veya küçülür. Tekdüze olmayan ölçeklemede şekil bozulur. Faktör 1,0 boyutu değiştirmez, 1,0'dan büyük büyütür, 0,0 ile 1,0 arası küçültür. Negatif değerler ayna yansıması oluşturur.

Rotate — Döndürme

Rotate, nesneyi orijin etrafında belirli bir açıyla döndürür. Pozitif döndürme açısı saat yönünün tersine dönüşe karşılık gelir. rotateByDegrees derece (0–360), rotateByRadians radyan (0–2π) kabul eder. Döndürme her zaman (0, 0) noktasına göre yapılır, bu nedenle rastgele bir nokta etrafında döndürmek için rotate ile translate'i birleştirmek gerekir.

3×3 Matris Gösterimi

NSAffineTransform'daki afin dönüşüm, son satırı her zaman [0, 0, 1] olan 3×3 matrisle temsil edilir. Bu, dönüşümlerin bir kombinasyonunu matrislerin çarpımı olarak temsil etmeye izin veren standart matematiksel gösterimdir. Matris yapısı, altı önemli bileşen içeren NSAffineTransformStruct aracılığıyla tanımlanır: m11, m12, m21, m22, tX, tY.

m11, m12, m21, m22 bileşenleri ölçekleme, döndürme ve kesmeden sorumludur. tX ve tY bileşenleri ötelemeden sorumludur. Standart yapılandırmada (birim matris), m11 = 1, m22 = 1 ve geri kalanı 0'dır. Geçerli matris değerlerini almak için, NSAffineTransformStruct yapısını döndüren NSAffineTransform özelliği transformStruct kullanılır.

Matris çarpımı değişmeli olmayan bir işlemdir. Bu, dönüşümleri uygulama sırasının önemli olduğu anlamına gelir: translate + rotate, rotate + translate'den farklı bir sonuç verir. Birleştirirken, NSAffineTransform yeni matrisi soldan geçerli matrisle çarpar: newMatrix = operation × currentMatrix. Bu nedenle, en son eklenen dönüşüm ilk önce uygulanır.

Dönüşümlerin Birleştirilmesi

NSAffineTransform, birden çok dönüşümü tek bir nesnede birleştirmeye izin verir. translateXBy:yBy:, scaleBy: veya rotateByDegrees: çağrılarının her biri iç matrisi değiştirir — geçerli matrisi ilgili dönüşümün matrisiyle çarpar. Bu, basit işlemler dizisinden karmaşık bir dönüşüm oluşturmayı sağlar.

Birleştirilmiş bir dönüşümü tersine çevirmek için invert yöntemi kullanılır. Ters, orijinali iptal eden yeni bir afin dönüşüm oluşturur: bir noktaya orijinal dönüşümü ve ardından tersini uygularsanız, nokta orijinal konumuna geri döner. Tersine çevirme, dönüştürülmemesi gereken UI öğelerini çizmeden önce bağlam dönüşümünü iptal etmek için kullanışlıdır.

Bir dönüşümün birim (koordinatları değiştirmez) olup olmadığını kontrol etmek için isIdentity özelliğini kullanın. Birim dönüşüm bir birim matristir — onunla çarpmak noktanın koordinatlarını değiştirmez. Yeni bir NSAffineTransform nesnesi birim dönüşüm olarak oluşturulur. Bu özellik optimizasyon için kullanışlıdır: dönüşüm birimse, uygulanması atlanabilir.

Nesnelere ve Bağlama Uygulama

NSAffineTransform dört tür nesneye uygulanabilir: NSPoint, NSSize, NSBezierPath ve NSGraphicsContext grafik bağlamı. Her hedef için ayrı bir yöntem vardır: transformPoint:, transformSize:, transformBezierPath: ve set.

Noktaların ve Boyutların Dönüştürülmesi

Yöntem transformPoint:, dönüşüm matrisini noktanın koordinat vektörü (x, y, 1) ile çarpar ve noktanın yeni konumunu döndürür. transformSize: benzer şekilde çalışır ancak tX ve tY bileşenlerini hesaba katmaz — öteleme uygulanmaz, yalnızca ölçekleme, döndürme ve kesme uygulanır. Bu, kaydırılmaması gereken vektörleri ve boyutları dönüştürmek için kullanışlıdır.

NSBezierPath Yollarının Dönüştürülmesi

Yöntem transformBezierPath:, her noktası NSAffineTransform matrisine göre dönüştürülen yeni bir NSBezierPath nesnesi oluşturur. Orijinal yol değiştirilmez — dönüştürülmüş koordinatlarla bir kopya oluşturulur. Bu, çok sayıda düğüme sahip karmaşık yollar için pahalı bir işlemdir.

Grafik Bağlamına Uygulama

Yöntem set, geçerli grafik bağlamına (NSGraphicsContext) dönüşümü uygulayarak CTM'sini (Geçerli Dönüşüm Matrisi) değiştirir. set çağrıldıktan sonra, bu bağlamdaki sonraki tüm çizimler dönüştürülecektir. Geçici dönüşümler için set'ten önce ve sonra saveGraphicsState / restoreGraphicsState kullanın.

Swift Kod Örnekleri

Grafik nesneleri dönüştürmek için macOS uygulamasında NSAffineTransform kullanımının pratik örneklerine bakalım.

Dönüşüm Oluşturma ve Birleştirme

Bu örnek, öteleme, döndürme ve ölçeklemeyi birleştiren bir NSAffineTransform oluşturur. Önce nesne (100, 50) kadar ötelenir, sonra 45 derece döndürülür ve son olarak 1,5 kat ölçeklenir. Sıra önemlidir: ötelemeden sonra döndürme, yeni orijine göre döndürür.

swift
import AppKit

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

// Noktaya uygulama
let point = NSPoint(x: 10, y: 20)
let transformedPoint = transform.transform(point)

// Boyuta uygulama
let size = NSSize(width: 100, height: 50)
let transformedSize = transform.transform(size)

Çizim için Bağlam Dönüşümü

Bu örnek, set ve concat aracılığıyla grafik bağlamına NSAffineTransform uygulanmasını gösterir. Dönüşüm uygulandıktan sonra, sonraki tüm çizimler dönüştürülmüş koordinat sisteminde gerçekleştirilir. saveGraphicsState ile grafik durumunu kaydetmek, orijinal matrise dönmeyi sağlar.

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önüştürülmüş koordinat sisteminde çizim
    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 Dönüşümü

Bu örnek, dönüştürülmüş koordinatlarla bir NSBezierPath'in kopyasını oluşturmayı gösterir. Orijinal yol değişmeden kalır ve dönüştürülmüş kopya ayrı olarak çizilebilir — bu, farklı konumlarda yinelenen öğeler oluşturmak için kullanışlı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
}

Sıkça Sorulan Sorular

NSAffineTransform ve CGAffineTransform arasındaki fark nedir?

NSAffineTransform AppKit'in (yalnızca macOS) bir sınıfıdır, CGAffineTransform ise Core Graphics'ın (iOS ve macOS) bir yapısıdır. NSAffineTransform nesne yönelimli bir sarmalayıcıdır ve NSBezierPath ile çalışmak için yöntemler sağlar. CGAffineTransform, CGPath ile kullanılan hafif bir değer türü yapısıdır.

Bir nesneyi merkezi etrafında nasıl döndürebilirim?

Merkez etrafında döndürmek için üç adım gerçekleştirin: 1) nesnenin merkezine öteleme (orijini merkeze taşıma), 2) istenen açıda döndürme, 3) negatif merkez vektörü kadar geri öteleme. Öteleme—döndürme—öteleme kombinasyonu, orijin yerine rastgele bir nokta etrafında döndürme sağlar.

NSAffineTransform'u iOS'ta kullanabilir miyim?

Hayır, NSAffineTransform yalnızca macOS'ta AppKit'in bir parçası olarak kullanılabilir. iOS'ta, benzer yetenekler sağlayan Core Graphics'ın CGAffineTransform yapısı kullanılır: CGAffineTransformMakeTranslation, CGAffineTransformMakeScale, CGAffineTransformMakeRotation ve CGAffineTransformConcat.

Bir dönüşümü nasıl iptal ederim?

Ters dönüşümü döndüren invert yöntemini kullanın. Orijinal dönüşümü tersiyle çarparsanız, bir birim matris (birim dönüşüm) elde edersiniz. Geçici uygulama için set'ten önce saveGraphicsState ve sonra restoreGraphicsState çağırın.

Ayna yansıması nasıl oluşturulur?

Negatif ölçekleme kullanın: transform.scaleXBy(-1, yBy: 1) yatay yansıma, scaleXBy(1, yBy: -1) dikey yansıma oluşturur. Rastgele bir eksene göre yansıtmak için translate (eksene kaydırma), -1 ile scale ve ters translate'i birleştirin.

Özet

  • NSAffineTransform, macOS'ta 3×3 matris ile afin dönüşümler için AppKit sınıfıdır
  • Dört temel tür: translate (öteleme), scale (ölçekleme), rotate (döndürme) ve shear (kesme)
  • 3×3 matris altı önemli bileşen içerir: m11, m12, m21, m22, tX, tY
  • Dönüşümleri birleştirme sırası sonucu etkiler — matris çarpımı değişmeli değildir
  • NSPoint, NSSize, NSBezierPath ve CTM aracılığıyla grafik bağlamına uygulanır
  • invert yöntemiyle tersine çevirme herhangi bir afin dönüşümü iptal eder
  • iOS'ta eşdeğeri, Core Graphics'ın CGAffineTransform yapısıdır

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun