ত্রিভুজের অভিমুখী ক্ষেত্রফল#

তিনটি বিন্দু $p_1$, $p_2$ ও $p_3$ দেওয়া আছে, তাদের দ্বারা গঠিত ত্রিভুজের অভিমুখী (চিহ্নসহ) ক্ষেত্রফল গণনা করুন। ক্ষেত্রফলের চিহ্ন নিম্নরূপে নির্ধারিত হয়: কল্পনা করুন আপনি সমতলে $p_1$ বিন্দুতে দাঁড়িয়ে আছেন এবং $p_2$-এর দিকে মুখ করে আছেন। আপনি $p_2$-তে যান এবং যদি $p_3$ আপনার ডানদিকে থাকে (তখন আমরা বলি তিনটি ভেক্টর “ঘড়ির কাঁটার দিকে” ঘোরে), ক্ষেত্রফলের চিহ্ন ঋণাত্মক, অন্যথায় ধনাত্মক। তিনটি বিন্দু সমরেখ হলে, ক্ষেত্রফল শূন্য।

এই চিহ্নসহ ক্ষেত্রফল ব্যবহার করে, আমরা সাধারণ চিহ্নহীন ক্ষেত্রফল (চিহ্নসহ ক্ষেত্রফলের পরম মান হিসেবে) পেতে পারি এবং বিন্দুগুলো তাদের নির্দিষ্ট ক্রমে ঘড়ির কাঁটার দিকে নাকি ঘড়ির কাঁটার বিপরীত দিকে আছে তা নির্ণয় করতে পারি (যা, উদাহরণস্বরূপ, কনভেক্স হাল অ্যালগরিদমে উপযোগী)।

গণনা#

আমরা এই তথ্য ব্যবহার করতে পারি যে একটি $2\times 2$ ম্যাট্রিক্সের ডিটারমিন্যান্ট ম্যাট্রিক্সের কলাম (বা সারি) ভেক্টর দ্বারা বিস্তৃত সামান্তরিকের চিহ্নসহ ক্ষেত্রফলের সমান। এটি ২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;
}

অনুশীলন সমস্যা#