সরলরেখার ছেদবিন্দু#

দুটি সরলরেখা দেওয়া আছে, $a_1 x + b_1 y + c_1 = 0$ এবং $a_2 x + b_2 y + c_2 = 0$ সমীকরণ দ্বারা বর্ণিত। আমাদের সরলরেখাদ্বয়ের ছেদবিন্দু খুঁজতে হবে, অথবা নির্ধারণ করতে হবে যে সরলরেখা দুটি সমান্তরাল।

সমাধান#

দুটি সরলরেখা সমান্তরাল না হলে, তারা ছেদ করে। তাদের ছেদবিন্দু খুঁজতে, আমাদের নিম্নলিখিত রৈখিক সমীকরণ ব্যবস্থা সমাধান করতে হবে:

$$\begin{cases} a_1 x + b_1 y + c_1 = 0 \\ a_2 x + b_2 y + c_2 = 0 \end{cases}$$

ক্র্যামারের নিয়ম ব্যবহার করে, আমরা সরাসরি ব্যবস্থার সমাধান লিখতে পারি, যা আমাদের সরলরেখাদ্বয়ের প্রয়োজনীয় ছেদবিন্দু দেবে:

$$x = - \frac{\begin{vmatrix}c_1 & b_1 \cr c_2 & b_2\end{vmatrix}}{\begin{vmatrix}a_1 & b_1 \cr a_2 & b_2\end{vmatrix} } = - \frac{c_1 b_2 - c_2 b_1}{a_1 b_2 - a_2 b_1},$$$$y = - \frac{\begin{vmatrix}a_1 & c_1 \cr a_2 & c_2\end{vmatrix}}{\begin{vmatrix}a_1 & b_1 \cr a_2 & b_2\end{vmatrix}} = - \frac{a_1 c_2 - a_2 c_1}{a_1 b_2 - a_2 b_1}.$$

যদি হর $0$ হয়, অর্থাৎ

$$\begin{vmatrix}a_1 & b_1 \cr a_2 & b_2\end{vmatrix} = a_1 b_2 - a_2 b_1 = 0 $$

তাহলে হয় ব্যবস্থার কোনো সমাধান নেই (সরলরেখাগুলো সমান্তরাল এবং ভিন্ন) অথবা অসীম সংখ্যক সমাধান আছে (সরলরেখাগুলো একই)। যদি এই দুটি ক্ষেত্র আলাদা করতে হয়, তাহলে সহগ $c$ গুলো $a$ এবং $b$ সহগের সাথে একই অনুপাতে সমানুপাতিক কি না তা পরীক্ষা করতে হবে। এটি করতে শুধু নিম্নলিখিত নির্ণায়কগুলো গণনা করতে হবে, এবং যদি দুটোই $0$ হয়, তাহলে সরলরেখাগুলো একই:

$$\begin{vmatrix}a_1 & c_1 \cr a_2 & c_2\end{vmatrix}, \begin{vmatrix}b_1 & c_1 \cr b_2 & c_2\end{vmatrix} $$

লক্ষ্য করুন, ছেদবিন্দু গণনার একটি ভিন্ন পদ্ধতি বেসিক জিওমেট্রি আর্টিকেলে ব্যাখ্যা করা আছে।

ইমপ্লিমেন্টেশন#

struct pt {
    double x, y;
};

struct line {
    double a, b, c;
};

const double EPS = 1e-9;

double det(double a, double b, double c, double d) {
    return a*d - b*c;
}

bool intersect(line m, line n, pt & res) {
    double zn = det(m.a, m.b, n.a, n.b);
    if (abs(zn) < EPS)
        return false;
    res.x = -det(m.c, m.b, n.c, n.b) / zn;
    res.y = -det(m.a, m.c, n.a, n.c) / zn;
    return true;
}

bool parallel(line m, line n) {
    return abs(det(m.a, m.b, n.a, n.b)) < EPS;
}

bool equivalent(line m, line n) {
    return abs(det(m.a, m.b, n.a, n.b)) < EPS
        && abs(det(m.a, m.c, n.a, n.c)) < EPS
        && abs(det(m.b, m.c, n.b, n.c)) < EPS;
}