NSAffineTransform হল AppKit (macOS) এর একটি ক্লাস যা দ্বি-মাত্রিক গ্রাফিক্সে অ্যাফাইন ট্রান্সফর্মেশন উপস্থাপন করে। এটি একটি 3×3 ম্যাট্রিক্স এনক্যাপসুলেট করে যা স্থানান্তর, স্কেলিং, ঘূর্ণন এবং শিয়ারিং-এর সংমিশ্রণ বর্ণনা করে। Apple ডকুমেন্টেশন (2026) অনুযায়ী, NSAffineTransform ব্যাপকভাবে Core Graphics-এ macOS-এ পাথ, পয়েন্ট এবং গ্রাফিক্স কনটেক্সট ট্রান্সফর্ম করতে ব্যবহৃত হয়।
মূল পয়েন্ট
NSAffineTransform হল AppKit ফ্রেমওয়ার্কের একটি ক্লাস, যা শুধুমাত্র macOS-এ উপলব্ধ। এটি একটি 3×3 ম্যাট্রিক্সের মাধ্যমে দ্বি-মাত্রিক স্থানে অ্যাফাইন ট্রান্সফর্মেশন উপস্থাপন করে। Core Graphics-এর CGAffineTransform (যা iOS-এ উপলব্ধ) থেকে ভিন্ন, NSAffineTransform হল CGAffineTransform স্ট্রাক্টের উপর একটি অবজেক্ট-ওরিয়েন্টেড র্যাপার, যা NSBezierPath, NSPoint এবং NSSize-এর সাথে কাজ করার জন্য সুবিধাজনক মেথড যোগ করে।
অ্যাফাইন ট্রান্সফর্মেশন হল সমতলের এমন একটি রূপান্তর যা “বিন্দু একটি রেখার উপর অবস্থিত” সম্পর্ক এবং রেখার সমান্তরালতা সংরক্ষণ করে। অন্য কথায়, অ্যাফাইন ট্রান্সফর্মেশনের পরে, সমান্তরাল রেখাগুলি সমান্তরাল থাকে এবং সরল রেখাগুলি সরল থাকে। তবে, দূরত্ব, কোণ এবং ক্ষেত্রফল পরিবর্তিত হতে পারে: স্কেলিং, ঘূর্ণন এবং কর্তন অ্যাফাইন ট্রান্সফর্মেশনের বিশেষ ক্ষেত্র।
iOS-এ, NSAffineTransform-এর সমতুল্য হল Core Graphics-এর CGAffineTransform স্ট্রাক্ট। উভয় API একই গাণিতিক মডেলের উপর ভিত্তি করে — একটি 3×3 অ্যাফাইন ট্রান্সফর্মেশন ম্যাট্রিক্স যেখানে শেষ সারিটি সর্বদা [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-এ একটি 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 মেথড ব্যবহার করা হয়। বিপরীত একটি নতুন অ্যাফাইন ট্রান্সফর্মেশন তৈরি করে যা মূলকে বাতিল করে: আপনি যদি একটি বিন্দুতে মূল ট্রান্সফর্মেশন প্রয়োগ করেন এবং তারপর বিপরীতটি, বিন্দুটি তার মূল অবস্থানে ফিরে আসে। বিপরীত 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 মেথডের মাধ্যমে বিপরীতকরণ যেকোনো অ্যাফাইন ট্রান্সফর্মেশন বাতিল করেআমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন