NSAffineTransform — یہ کیا ہے، تبدیلیوں کی اقسام اور انہیں کیسے لاگو کریں

مصنف: IT Sectr اشاعت: 2026-07-22 مطالعے کا وقت: 9 منٹ

NSAffineTransform AppKit (macOS) کی ایک کلاس ہے جو دو جہتی گرافکس میں affine تبدیلی کو ظاہر کرتی ہے۔ یہ 3×3 میٹرکس کو سمیٹتی ہے جو نقاط کی منتقلی، پیمائش، گردش اور کترن کے امتزاج کو بیان کرتی ہے۔ Apple دستاویزات (2026) کے مطابق، NSAffineTransform بڑے پیمانے پر Core Graphics میں macOS پر راستوں، نقاط اور گرافکس سیاق و سباق کو تبدیل کرنے کے لیے استعمال ہوتا ہے۔

اہم نکات

  • NSAffineTransform macOS پر 3×3 میٹرکس کے ساتھ affine تبدیلیوں کے لیے AppKit کلاس ہے
  • Affine تبدیلی خطوط کی متوازیت کو برقرار رکھتی ہے لیکن فاصلوں اور زاویوں کو بدل سکتی ہے
  • بنیادی عملیات: translate (منتقلی)، scale (پیمائش)، rotate (گردش)، shear (کترن)
  • تبدیلیاں میٹرکس ضرب کے ذریعے ملائی جاتی ہیں — عملیات کی ترتیب نتیجہ کو متاثر کرتی ہے
  • NSAffineTransform نقاط، سائز، راستوں اور Core Graphics سیاق و سباق پر لاگو ہوتا ہے

NSAffineTransform کیا ہے؟

NSAffineTransform AppKit فریم ورک کی ایک کلاس ہے، جو صرف macOS پر دستیاب ہے۔ یہ 3×3 میٹرکس کے ذریعے دو جہتی فضا میں affine تبدیلی کو ظاہر کرتی ہے۔ Core Graphics کے CGAffineTransform (جو iOS پر دستیاب ہے) کے برعکس، NSAffineTransform CGAffineTransform ساخت کے گرد ایک آبجیکٹ اورینٹڈ لفافہ ہے، جو NSBezierPath، NSPoint اور NSSize کے ساتھ کام کرنے کے لیے آسان طریقے شامل کرتا ہے۔

Affine تبدیلی سطح کی ایک ایسی تبدیلی ہے جو «نقطہ ایک لائن پر واقع ہے» کے تعلق اور خطوط کی متوازیت کو برقرار رکھتی ہے۔ دوسرے لفظوں میں، affine تبدیلی کے بعد، متوازی خطوط متوازی رہتے ہیں اور سیدھی خطوط سیدھی رہتی ہیں۔ تاہم، فاصلے، زاویے اور رقبے بدل سکتے ہیں: پیمائش، گردش اور کترن affine تبدیلیوں کی خاص حالتیں ہیں۔

iOS پر، NSAffineTransform کا ہم پلہ Core Graphics کا CGAffineTransform ساخت ہے۔ دونوں APIs ایک ہی ریاضیاتی ماڈل پر مبنی ہیں — 3×3 affine تبدیلی میٹرکس جس کی آخری قطار ہمیشہ [0, 0, 1] ہوتی ہے۔ فرق یہ ہے کہ NSAffineTransform ایک کلاس ہے (Objective-C میں retain/release کے ساتھ)، جبکہ CGAffineTransform Swift اور C میں ایک ساخت (قدر کی قسم) ہے۔

Affine تبدیلیوں کی اقسام

NSAffineTransform چار بنیادی اقسام کی تبدیلیوں کو سپورٹ کرتا ہے: translate (منتقلی)، scale (پیمائش)، rotate (گردش)، اور shear (کترن)۔ ہر قسم کو ایک علیحدہ طریقے سے ظاہر کیا جاتا ہے اور اسے موجودہ تبدیلی آبجیکٹ پر لاگو کیا جا سکتا ہے یا نیا بنانے کے لیے استعمال کیا جا سکتا ہے۔

عملNSAffineTransform طریقہپیرامیٹرزبصری اثر
TranslatetranslateXBy:yBy:deltaX, deltaYآبجیکٹ کو X اور Y محوروں پر منتقل کرتا ہے
ScalescaleBy: / scaleXBy:yBy:factor / scaleX, scaleYسائز بڑھاتا یا گھٹاتا ہے
RotaterotateByDegrees: / rotateByRadians:ڈگری یا ریڈین میں زاویہمبدأ کے گرد گھماتا ہے
ShearsetTransformStruct کے ذریعےمیٹرکس کے m12, m21 اجزاءآبجیکٹ کو ایک محور پر ترچھا کرتا ہے

Translate — منتقلی

Translate آبجیکٹ کے تمام نقاط کے متناسقات میں ایک آفسیٹ شامل کرتا ہے۔ پیرامیٹرز deltaX اور deltaY بالترتیب افقی اور عمودی منتقلی کی مقدار مقرر کرتے ہیں۔ مثبت deltaX قدر دائیں منتقل کرتی ہے، deltaY اوپر۔ Translate آبجیکٹ کی شکل یا سائز نہیں بدلتا — صرف اس کی پوزیشن بدلتا ہے۔

Scale — پیمائش

Scale نقاط کے متناسقات کو دیے گئے عامل سے ضرب دیتا ہے۔ یکساں پیمائش (ایک پیرامیٹر) سے آبجیکٹ متناسب طور پر بڑھتا یا گھٹتا ہے۔ غیر یکساں پیمائش سے شکل بگڑ جاتی ہے۔ عامل 1.0 سائز کو برقرار رکھتا ہے، 1.0 سے بڑا بڑھاتا ہے، 0.0 سے 1.0 تک گھٹاتا ہے۔ منفی قدریں آئینہ عکاس بناتی ہیں۔

Rotate — گردش

Rotate آبجیکٹ کو مبدأ کے گرد دیے گئے زاویے پر گھماتا ہے۔ مثبت گردش زاویہ مخالف گھڑی کی سمت گردش سے مطابقت رکھتا ہے۔ rotateByDegrees ڈگری (0–360)، rotateByRadians ریڈین (0–2π) قبول کرتا ہے۔ گردش ہمیشہ نقطہ (0, 0) کی نسبت کی جاتی ہے، لہٰذا کسی بھی نقطے کے گرد گھمانے کے لیے، rotate کو translate کے ساتھ ملانا ضروری ہے۔

3×3 میٹرکس کا اظہار

NSAffineTransform میں affine تبدیلی کو 3×3 میٹرکس سے ظاہر کیا جاتا ہے جس کی آخری قطار ہمیشہ [0, 0, 1] ہوتی ہے۔ یہ معیاری ریاضیاتی اظہار ہے جو تبدیلیوں کے امتزاج کو میٹرکس کی ضرب کے طور پر پیش کرنے کی اجازت دیتا ہے۔ میٹرکس ساخت NSAffineTransformStruct کے ذریعے متعین کی جاتی ہے، جس میں چھ اہم اجزاء ہوتے ہیں: m11, m12, m21, m22, tX, tY۔

m11، m12، m21، m22 اجزاء پیمائش، گردش اور کترن کے ذمہ دار ہیں۔ tX اور tY اجزاء منتقلی کے ذمہ دار ہیں۔ معیاری ترتیب (شناخت میٹرکس) میں، m11 = 1، m22 = 1، اور باقی 0 کے برابر ہیں۔ موجودہ میٹرکس قدریں حاصل کرنے کے لیے، transformStruct استعمال کیا جاتا ہے — NSAffineTransform کی وہ خاصیت جو NSAffineTransformStruct ساخت لوٹاتی ہے۔

میٹرکس ضرب ایک غیر تبدیل پذیر عمل ہے۔ اس کا مطلب ہے کہ تبدیلیوں کو لاگو کرنے کی ترتیب اہم ہے: translate + rotate ایک مختلف نتیجہ دیتا ہے rotate + translate سے۔ امتزاج کرتے وقت، NSAffineTransform نئی میٹرکس کو بائیں طرف موجودہ میٹرکس سے ضرب دیتا ہے: newMatrix = operation × currentMatrix۔ لہٰذا، آخری شامل کردہ تبدیلی پہلے لاگو ہوتی ہے۔

تبدیلیوں کا امتزاج

NSAffineTransform ایک ہی آبجیکٹ میں متعدد تبدیلیوں کو ملانے کی اجازت دیتا ہے۔ translateXBy:yBy:، scaleBy: یا rotateByDegrees: کی ہر کال اندرونی میٹرکس کو تبدیل کرتی ہے — موجودہ میٹرکس کو متعلقہ تبدیلی کے میٹرکس سے ضرب دیتی ہے۔ یہ سادہ عملیات کے سلسلے سے پیچیدہ تبدیلی بنانے کی اجازت دیتا ہے۔

ملے جلے تبدیلی کو الٹانے کے لیے، invert طریقہ استعمال کیا جاتا ہے۔ الٹا ایک نئی affine تبدیلی بناتا ہے جو اصلی کو منسوخ کرتی ہے: اگر آپ کسی نقطے پر اصلی تبدیلی لاگو کریں اور پھر الٹا، نقطہ اپنی اصلی جگہ پر واپس آجاتا ہے۔ الٹانا UI عناصر کی ڈرائنگ سے پہلے سیاق و سباق کی تبدیلی کو منسوخ کرنے کے لیے مفید ہے جنہیں تبدیل نہیں کیا جانا چاہیے۔

یہ جانچنے کے لیے کہ آیا کوئی تبدیلی شناخت ہے (متناسقات نہیں بدلتی)، isIdentity خاصیت استعمال کریں۔ شناخت تبدیلی ایک اکائی میٹرکس ہے — اس سے ضرب دینے پر نقطے کے متناسقات نہیں بدلتے۔ ایک نیا NSAffineTransform آبجیکٹ شناخت تبدیلی کے طور پر بنایا جاتا ہے۔ یہ خاصیت اصلاح کے لیے مفید ہے: اگر تبدیلی شناخت ہے، تو اس کا اطلاق چھوڑا جا سکتا ہے۔

آبجیکٹس اور سیاق و سباق پر اطلاق

NSAffineTransform چار اقسام کے آبجیکٹس پر لاگو کیا جا سکتا ہے: NSPoint، NSSize، NSBezierPath، اور NSGraphicsContext گرافکس سیاق و سباق۔ ہر ہدف کے لیے ایک علیحدہ طریقہ ہے: transformPoint:، transformSize:، transformBezierPath:، اور set۔

نقاط اور سائز کی تبدیلی

طریقہ transformPoint: تبدیلی میٹرکس کو نقطے کے متناسق ویکٹر (x, y, 1) سے ضرب دیتا ہے، اور نقطے کی نئی پوزیشن لوٹاتا ہے۔ transformSize: اسی طرح کام کرتا ہے لیکن tX اور tY اجزاء کو مدنظر نہیں رکھتا — منتقلی لاگو نہیں ہوتی، صرف پیمائش، گردش اور کترن۔ یہ ان ویکٹرز اور سائز کو تبدیل کرنے کے لیے مفید ہے جنہیں منتقل نہیں کیا جانا چاہیے۔

NSBezierPath راستوں کی تبدیلی

طریقہ transformBezierPath: ایک نیا NSBezierPath آبجیکٹ بناتا ہے، جس کا ہر نقطہ NSAffineTransform میٹرکس کے مطابق تبدیل ہوتا ہے۔ اصلی راستہ تبدیل نہیں ہوتا — تبدیل شدہ متناسقات کے ساتھ ایک نقل بنائی جاتی ہے۔ یہ بڑی تعداد میں نوڈس والے پیچیدہ راستوں کے لیے ایک مہنگا عمل ہے۔

گرافکس سیاق و سباق پر اطلاق

طریقہ set موجودہ گرافکس سیاق و سباق (NSGraphicsContext) پر تبدیلی لاگو کرتا ہے، اس کے CTM (موجودہ تبدیلی میٹرکس) کو تبدیل کرتا ہے۔ set کو کال کرنے کے بعد، اس سیاق و سباق میں بعد کی تمام ڈرائنگ تبدیل ہوگی۔ عارضی تبدیلیوں کے لیے، set سے پہلے اور بعد میں saveGraphicsState / restoreGraphicsState استعمال کریں۔

Swift کوڈ کی مثالیں

گرافک آبجیکٹس کو تبدیل کرنے کے لیے macOS ایپلیکیشن میں NSAffineTransform کے استعمال کی عملی مثالیں دیکھتے ہیں۔

تبدیلیاں بنانا اور ملانا

یہ مثال ایک NSAffineTransform بناتی ہے جو منتقلی، گردش اور پیمائش کو ملاتی ہے۔ پہلے، آبجیکٹ (100, 50) سے منتقل کیا جاتا ہے، پھر 45 ڈگری گھمایا جاتا ہے، اور آخر میں 1.5 گنا بڑھایا جاتا ہے۔ ترتیب اہم ہے: منتقلی کے بعد گردش نئے مبدأ کی نسبت گھماتی ہے۔

swift
import AppKit

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

// نقطہ پر اطلاق
let point = NSPoint(x: 10, y: 20)
let transformedPoint = transform.transform(point)

// سائز پر اطلاق
let size = NSSize(width: 100, height: 50)
let transformedSize = transform.transform(size)

ڈرائنگ کے لیے سیاق و سباق کی تبدیلی

یہ مثال set اور concat کے ذریعے گرافکس سیاق و سباق پر NSAffineTransform کے اطلاق کو ظاہر کرتی ہے۔ تبدیلی لاگو کرنے کے بعد، بعد کی تمام ڈرائنگ تبدیل شدہ متناسق نظام میں کی جاتی ہے۔ saveGraphicsState کے ذریعے گرافکس حالت کو محفوظ کرنا اصلی میٹرکس پر واپس آنے کی اجازت دیتا ہے۔

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

    // تبدیل شدہ متناسق نظام میں ڈرائنگ
    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 کی تبدیلی

یہ مثال تبدیل شدہ متناسقات کے ساتھ NSBezierPath کی نقل بنانے کو ظاہر کرتی ہے۔ اصلی راستہ تبدیل نہیں ہوتا، اور تبدیل شدہ نقل علیحدہ سے کھینچی جا سکتی ہے — یہ مختلف مقامات پر بار بار عناصر بنانے کے لیے مفید ہے۔

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
}

اکثر پوچھے گئے سوالات

NSAffineTransform اور CGAffineTransform میں کیا فرق ہے؟

NSAffineTransform AppKit (صرف macOS) کی ایک کلاس ہے، جبکہ CGAffineTransform Core Graphics (iOS اور macOS) کی ایک ساخت ہے۔ NSAffineTransform ایک آبجیکٹ اورینٹڈ لفافہ ہے اور NSBezierPath کے ساتھ کام کرنے کے لیے طریقے فراہم کرتا ہے۔ CGAffineTransform CGPath کے ساتھ استعمال ہونے والی ایک ہلکی قدر کی قسم کی ساخت ہے۔

میں کسی آبجیکٹ کو اس کے مرکز کے گرد کیسے گھماؤں؟

مرکز کے گرد گھمانے کے لیے تین مراحل انجام دیں: 1) آبجیکٹ کے مرکز پر منتقل کریں (مبدأ کو مرکز میں لے جائیں)، 2) مطلوبہ زاویے پر گھمائیں، 3) منفی مرکز ویکٹر سے واپس منتقل کریں۔ منتقلی—گردش—منتقلی کا امتزاج مبدأ کے بجائے کسی بھی نقطے کے گرد گردش دیتا ہے۔

کیا میں iOS پر NSAffineTransform استعمال کر سکتا ہوں؟

نہیں، NSAffineTransform صرف macOS پر AppKit کے حصے کے طور پر دستیاب ہے۔ iOS پر، Core Graphics کی CGAffineTransform ساخت استعمال کی جاتی ہے، جو مماثل صلاحیتیں فراہم کرتی ہے: CGAffineTransformMakeTranslation، CGAffineTransformMakeScale، CGAffineTransformMakeRotation اور CGAffineTransformConcat۔

میں تبدیلی کیسے منسوخ کروں؟

invert طریقہ استعمال کریں، جو الٹی تبدیلی لوٹاتا ہے۔ اگر آپ اصلی تبدیلی کو الٹی سے ضرب دیں، تو آپ کو ایک اکائی میٹرکس (شناخت تبدیلی) ملتی ہے۔ عارضی اطلاق کے لیے، set سے پہلے saveGraphicsState اور بعد میں restoreGraphicsState کال کریں۔

میں آئینہ عکاس کیسے بناؤں؟

منفی پیمائش استعمال کریں: transform.scaleXBy(-1, yBy: 1) افقی عکاس بناتا ہے، جبکہ scaleXBy(1, yBy: -1) عمودی عکاس بناتا ہے۔ کسی بھی محور کی نسبت عکاس کے لیے، translate (محور پر منتقلی)، -1 کے ساتھ scale، اور الٹا translate ملائیں۔

خلاصہ

  • NSAffineTransform macOS پر 3×3 میٹرکس کے ساتھ affine تبدیلیوں کے لیے AppKit کلاس ہے
  • چار بنیادی اقسام: translate (منتقلی)، scale (پیمائش)، rotate (گردش)، اور shear (کترن)
  • 3×3 میٹرکس میں چھ اہم اجزاء ہوتے ہیں: m11، m12، m21، m22، tX، tY
  • تبدیلیوں کو ملانے کی ترتیب نتیجہ کو متاثر کرتی ہے — میٹرکس ضرب غیر تبدیل پذیر ہے
  • NSPoint، NSSize، NSBezierPath اور CTM کے ذریعے گرافکس سیاق و سباق پر لاگو ہوتا ہے
  • invert طریقہ سے الٹانا کسی بھی affine تبدیلی کو منسوخ کرتا ہے
  • iOS پر، ہم پلہ Core Graphics کی CGAffineTransform ساخت ہے

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں