Шулуунуудын огтлолцлын цэг¶
Танд $a_1 x + b_1 y + c_1 = 0$ ба $a_2 x + b_2 y + c_2 = 0$ тэгшитгэлүүдээр тодорхойлогдсон хоёр шулуун өгөгдсөн. Бид шулуунуудын огтлолцлын цэгийг олох, эсвэл шулуунууд параллель болохыг тогтоох ёстой.
Шийдэл¶
Хэрэв хоёр шулуун параллель биш бол тэдгээр огтлолцоно. Тэдгээрийн огтлолцлын цэгийг олохын тулд бид дараах шугаман тэгшитгэлийн системийг бодох хэрэгтэй:
Крамерын дүрмийг ашиглан бид системийн шийдийг шууд бичиж болох ба энэ нь бидэнд шулуунуудын шаардлагатай огтлолцлын цэгийг өгнө:
Хэрэв хуваарь $0$-тэй тэнцүү бол буюу
бол систем шийдгүй (шулуунууд параллель бөгөөд ялгаатай), эсвэл төгсгөлгүй олон шийдтэй (шулуунууд давхцана). Хэрэв бид эдгээр хоёр тохиолдлыг ялгах шаардлагатай бол $c$ коэффициентүүд $a$ ба $b$ коэффициентүүдтэй ижил харьцаагаар пропорциональ эсэхийг шалгах хэрэгтэй. Үүний тулд бид зөвхөн дараах тодорхойлогчуудыг тооцоолох хэрэгтэй бөгөөд хэрэв тэдгээр хоёул $0$-тэй тэнцүү бол шулуунууд давхцана:
Огтлолцлын цэгийг тооцоолох өөр аргыг Үндсэн геометр өгүүлэлд тайлбарласныг анхаарна уу.
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;
}