NSAffineTransform AppKit (macOS) کی ایک کلاس ہے جو دو جہتی گرافکس میں affine تبدیلی کو ظاہر کرتی ہے۔ یہ 3×3 میٹرکس کو سمیٹتی ہے جو نقاط کی منتقلی، پیمائش، گردش اور کترن کے امتزاج کو بیان کرتی ہے۔ Apple دستاویزات (2026) کے مطابق، NSAffineTransform بڑے پیمانے پر Core Graphics میں macOS پر راستوں، نقاط اور گرافکس سیاق و سباق کو تبدیل کرنے کے لیے استعمال ہوتا ہے۔
اہم نکات
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 میں ایک ساخت (قدر کی قسم) ہے۔
NSAffineTransform چار بنیادی اقسام کی تبدیلیوں کو سپورٹ کرتا ہے: translate (منتقلی)، scale (پیمائش)، rotate (گردش)، اور shear (کترن)۔ ہر قسم کو ایک علیحدہ طریقے سے ظاہر کیا جاتا ہے اور اسے موجودہ تبدیلی آبجیکٹ پر لاگو کیا جا سکتا ہے یا نیا بنانے کے لیے استعمال کیا جا سکتا ہے۔
| عمل | NSAffineTransform طریقہ | پیرامیٹرز | بصری اثر |
|---|---|---|---|
| Translate | translateXBy:yBy: | deltaX, deltaY | آبجیکٹ کو X اور Y محوروں پر منتقل کرتا ہے |
| Scale | scaleBy: / scaleXBy:yBy: | factor / scaleX, scaleY | سائز بڑھاتا یا گھٹاتا ہے |
| Rotate | rotateByDegrees: / rotateByRadians: | ڈگری یا ریڈین میں زاویہ | مبدأ کے گرد گھماتا ہے |
| Shear | setTransformStruct کے ذریعے | میٹرکس کے m12, m21 اجزاء | آبجیکٹ کو ایک محور پر ترچھا کرتا ہے |
Translate آبجیکٹ کے تمام نقاط کے متناسقات میں ایک آفسیٹ شامل کرتا ہے۔ پیرامیٹرز deltaX اور deltaY بالترتیب افقی اور عمودی منتقلی کی مقدار مقرر کرتے ہیں۔ مثبت deltaX قدر دائیں منتقل کرتی ہے، deltaY اوپر۔ Translate آبجیکٹ کی شکل یا سائز نہیں بدلتا — صرف اس کی پوزیشن بدلتا ہے۔
Scale نقاط کے متناسقات کو دیے گئے عامل سے ضرب دیتا ہے۔ یکساں پیمائش (ایک پیرامیٹر) سے آبجیکٹ متناسب طور پر بڑھتا یا گھٹتا ہے۔ غیر یکساں پیمائش سے شکل بگڑ جاتی ہے۔ عامل 1.0 سائز کو برقرار رکھتا ہے، 1.0 سے بڑا بڑھاتا ہے، 0.0 سے 1.0 تک گھٹاتا ہے۔ منفی قدریں آئینہ عکاس بناتی ہیں۔
Rotate آبجیکٹ کو مبدأ کے گرد دیے گئے زاویے پر گھماتا ہے۔ مثبت گردش زاویہ مخالف گھڑی کی سمت گردش سے مطابقت رکھتا ہے۔ rotateByDegrees ڈگری (0–360)، rotateByRadians ریڈین (0–2π) قبول کرتا ہے۔ گردش ہمیشہ نقطہ (0, 0) کی نسبت کی جاتی ہے، لہٰذا کسی بھی نقطے کے گرد گھمانے کے لیے، rotate کو translate کے ساتھ ملانا ضروری ہے۔
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 اجزاء کو مدنظر نہیں رکھتا — منتقلی لاگو نہیں ہوتی، صرف پیمائش، گردش اور کترن۔ یہ ان ویکٹرز اور سائز کو تبدیل کرنے کے لیے مفید ہے جنہیں منتقل نہیں کیا جانا چاہیے۔
طریقہ transformBezierPath: ایک نیا NSBezierPath آبجیکٹ بناتا ہے، جس کا ہر نقطہ NSAffineTransform میٹرکس کے مطابق تبدیل ہوتا ہے۔ اصلی راستہ تبدیل نہیں ہوتا — تبدیل شدہ متناسقات کے ساتھ ایک نقل بنائی جاتی ہے۔ یہ بڑی تعداد میں نوڈس والے پیچیدہ راستوں کے لیے ایک مہنگا عمل ہے۔
طریقہ set موجودہ گرافکس سیاق و سباق (NSGraphicsContext) پر تبدیلی لاگو کرتا ہے، اس کے CTM (موجودہ تبدیلی میٹرکس) کو تبدیل کرتا ہے۔ set کو کال کرنے کے بعد، اس سیاق و سباق میں بعد کی تمام ڈرائنگ تبدیل ہوگی۔ عارضی تبدیلیوں کے لیے، set سے پہلے اور بعد میں saveGraphicsState / restoreGraphicsState استعمال کریں۔
گرافک آبجیکٹس کو تبدیل کرنے کے لیے macOS ایپلیکیشن میں NSAffineTransform کے استعمال کی عملی مثالیں دیکھتے ہیں۔
یہ مثال ایک NSAffineTransform بناتی ہے جو منتقلی، گردش اور پیمائش کو ملاتی ہے۔ پہلے، آبجیکٹ (100, 50) سے منتقل کیا جاتا ہے، پھر 45 ڈگری گھمایا جاتا ہے، اور آخر میں 1.5 گنا بڑھایا جاتا ہے۔ ترتیب اہم ہے: منتقلی کے بعد گردش نئے مبدأ کی نسبت گھماتی ہے۔
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 کے ذریعے گرافکس حالت کو محفوظ کرنا اصلی میٹرکس پر واپس آنے کی اجازت دیتا ہے۔
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 کی نقل بنانے کو ظاہر کرتی ہے۔ اصلی راستہ تبدیل نہیں ہوتا، اور تبدیل شدہ نقل علیحدہ سے کھینچی جا سکتی ہے — یہ مختلف مقامات پر بار بار عناصر بنانے کے لیے مفید ہے۔
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 AppKit (صرف macOS) کی ایک کلاس ہے، جبکہ CGAffineTransform Core Graphics (iOS اور macOS) کی ایک ساخت ہے۔ NSAffineTransform ایک آبجیکٹ اورینٹڈ لفافہ ہے اور NSBezierPath کے ساتھ کام کرنے کے لیے طریقے فراہم کرتا ہے۔ CGAffineTransform CGPath کے ساتھ استعمال ہونے والی ایک ہلکی قدر کی قسم کی ساخت ہے۔
مرکز کے گرد گھمانے کے لیے تین مراحل انجام دیں: 1) آبجیکٹ کے مرکز پر منتقل کریں (مبدأ کو مرکز میں لے جائیں)، 2) مطلوبہ زاویے پر گھمائیں، 3) منفی مرکز ویکٹر سے واپس منتقل کریں۔ منتقلی—گردش—منتقلی کا امتزاج مبدأ کے بجائے کسی بھی نقطے کے گرد گردش دیتا ہے۔
نہیں، 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 ملائیں۔
خلاصہ
invert طریقہ سے الٹانا کسی بھی affine تبدیلی کو منسوخ کرتا ہےہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں