Агуулгыг алгасах

Шулуунуудын огтлолцлын цэг

Танд $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} $$

Огтлолцлын цэгийг тооцоолох өөр аргыг Үндсэн геометр өгүүлэлд тайлбарласныг анхаарна уу.

Implementation

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;
}