ত্রিভুজের অভিমুখী ক্ষেত্রফল#
তিনটি বিন্দু $p_1$, $p_2$ ও $p_3$ দেওয়া আছে, তাদের দ্বারা গঠিত ত্রিভুজের অভিমুখী (signed) ক্ষেত্রফল গণনা করো। ক্ষেত্রফলের চিহ্ন এভাবে নির্ধারিত হয়: কল্পনা করো তুমি সমতলে $p_1$ বিন্দুতে দাঁড়িয়ে আছ এবং $p_2$-এর দিকে মুখ করে আছ। তুমি $p_2$-তে যাও এবং যদি $p_3$ তোমার ডানদিকে থাকে (তখন আমরা বলি তিনটি ভেক্টর “ঘড়ির কাঁটার দিকে” ঘোরে), ক্ষেত্রফলের চিহ্ন ঋণাত্মক, অন্যথায় ধনাত্মক। তিনটি বিন্দু সমরেখ হলে, ক্ষেত্রফল শূন্য।
এই signed ক্ষেত্রফল ব্যবহার করে, আমরা সাধারণ unsigned ক্ষেত্রফল (signed ক্ষেত্রফলের পরম মান হিসেবে) পেতে পারি এবং বিন্দুগুলো তাদের নির্দিষ্ট ক্রমে ঘড়ির কাঁটার দিকে নাকি ঘড়ির কাঁটার বিপরীত দিকে আছে তা বের করতে পারি (যেটা, উদাহরণস্বরূপ, কনভেক্স হাল অ্যালগরিদমে কাজে লাগে)।
গণনা#
আমরা এই তথ্য ব্যবহার করতে পারি যে একটা $2\times 2$ ম্যাট্রিক্সের ডিটারমিন্যান্ট (determinant) ম্যাট্রিক্সের কলাম (বা সারি) ভেক্টর দ্বারা বিস্তৃত সামান্তরিকের signed ক্ষেত্রফলের সমান। এটা ২D-তে ক্রস প্রোডাক্টের সংজ্ঞার সাদৃশ্য (দেখো বেসিক জিওমেট্রি)। এই ক্ষেত্রফলকে দুই দিয়ে ভাগ করলে আমরা ত্রিভুজের ক্ষেত্রফল পাই যেটা আমাদের দরকার। আমরা $\vec{p_1p_2}$ ও $\vec{p_2p_3}$ কে কলাম ভেক্টর হিসেবে ব্যবহার করব এবং একটি $2\times 2$ ডিটারমিন্যান্ট গণনা করব:
$$2S=\left|\begin{matrix}x_2-x_1 & x_3-x_2\\y_2-y_1 & y_3-y_2\end{matrix}\right|=(x_2-x_1)(y_3-y_2)-(x_3-x_2)(y_2-y_1)$$ইমপ্লিমেন্টেশন#
int signed_area_parallelogram(point2d p1, point2d p2, point2d p3) {
return cross(p2 - p1, p3 - p2);
}
double triangle_area(point2d p1, point2d p2, point2d p3) {
return abs(signed_area_parallelogram(p1, p2, p3)) / 2.0;
}
bool clockwise(point2d p1, point2d p2, point2d p3) {
return signed_area_parallelogram(p1, p2, p3) < 0;
}
bool counter_clockwise(point2d p1, point2d p2, point2d p3) {
return signed_area_parallelogram(p1, p2, p3) > 0;
}