De ce contează?
Imaginează-ți o dreaptă infinită trasă pe o foaie nesfârșită. Ea taie planul în două jumătăți: tot ce e „deasupra” și tot ce e „dedesubt”. Punctele chiar pe linie nu sunt nici într-o parte, nici în alta. Dacă ai o singură formulă care îți spune, pentru orice punct, în ce jumătate cade — sau dacă e fix pe linie — ai în mână jumătate din geometria de concurs. Acea formulă e ecuația dreptei.
De ce forma generală ax + by + c = 0
În școală întâlnești mai întâi forma y = mx + n, unde m e panta. E comodă pe
hârtie, dar are o gaură: o dreaptă verticală ca x = 5 nu se poate scrie așa,
fiindcă panta ei e „infinită”. Iar în algoritmică tocmai dreptele verticale apar
des și strică soluțiile care presupun că panta există mereu.
Forma generală repară asta. Orice dreaptă din plan se scrie ca:
a·x + b·y + c = 0
unde a, b, c sunt numere. Dreapta verticală x = 5 devine 1·x + 0·y - 5 = 0,
deci a = 1, b = 0, c = -5 — niciun caz special. Un al doilea avantaj uriaș:
când plecăm de la puncte cu coordonate întregi, obținem a, b, c întregi
fără nicio împărțire. Așa eviți numerele reale (float) și erorile lor de
rotunjire. În acest capitol ținem a, b, c în long long. (Despre pantă și
forma y = mx + n avem o lecție separată.)
Cum afli a, b, c din două puncte
Ai două puncte distincte A(x1, y1) și B(x2, y2) și vrei dreapta prin ele.
Formulele, gândite special ca să dea întregi, sunt:
a = y2 - y1b = x1 - x2c = -(a·x1 + b·y1)
Ultima linie e doar „forțăm ca A să fie pe dreaptă”: punem coordonatele lui A
în a·x + b·y și alegem c astfel încât suma să dea 0. Punctul B iese
automat tot pe dreaptă.
Testul „pe dreaptă”. Un punct P(px, py) e pe dreaptă dacă și numai dacă:
a·px + b·py + c == 0
Semnul = partea. Dacă valoarea NU e zero, semnul ei spune în care din cele
două jumătăți de plan se află P. Toate punctele dintr-o parte dau același semn
(de exemplu pozitiv), toate din cealaltă parte dau semnul opus. Așa decizi, cu o
singură evaluare și fără float, dacă două puncte sunt de aceeași parte a dreptei
(semne egale) sau de o parte și de alta (semne diferite).
Exemplu pas cu pas
Luăm dreapta prin A(1, 1) și B(3, 5).
a = y2 - y1 = 5 - 1 = 4b = x1 - x2 = 1 - 3 = -2c = -(a·x1 + b·y1) = -(4·1 + (-2)·1) = -(4 - 2) = -2
Deci dreapta e 4·x - 2·y - 2 = 0. Verificăm că trece prin ambele puncte:
- în
A(1, 1):4·1 - 2·1 - 2 = 4 - 2 - 2 = 0✓ - în
B(3, 5):4·3 - 2·5 - 2 = 12 - 10 - 2 = 0✓
Acum testăm trei puncte cu aceeași expresie f(P) = 4·px - 2·py - 2:
P(2, 3):4·2 - 2·3 - 2 = 8 - 6 - 2 = 0→ e pe dreaptăQ(4, 1):4·4 - 2·1 - 2 = 16 - 2 - 2 = 12→ semn pozitiv, o parteR(0, 4):4·0 - 2·4 - 2 = 0 - 8 - 2 = -10→ semn negativ, cealaltă parte
Punctele Q și R sunt de o parte și de alta a dreptei (semne diferite).
Implementare C++
#include <iostream>
using namespace std;
// coeficientii dreptei prin doua puncte (coordonate intregi)
struct Dreapta {
long long a, b, c;
};
// construieste a, b, c astfel incat A si B sa fie pe dreapta
Dreapta dinDouaPuncte(long long x1, long long y1, long long x2, long long y2) {
Dreapta d;
d.a = y2 - y1;
d.b = x1 - x2;
d.c = -(d.a * x1 + d.b * y1); // forteaza A pe dreapta
return d;
}
// evalueaza a*x + b*y + c pentru punctul (px, py)
long long evalueaza(Dreapta d, long long px, long long py) {
return d.a * px + d.b * py + d.c;
}
int main() {
Dreapta d = dinDouaPuncte(1, 1, 3, 5); // prin A(1,1) si B(3,5)
cout << d.a << " " << d.b << " " << d.c << "\n"; // 4 -2 -2
long long f = evalueaza(d, 2, 3); // P(2,3) e pe dreapta?
if (f == 0) {
cout << "P este pe dreapta\n"; // se afiseaza
} else if (f > 0) {
cout << "P este intr-o parte\n";
} else {
cout << "P este in cealalta parte\n";
}
cout << evalueaza(d, 4, 1) << "\n"; // 12 (o parte)
cout << evalueaza(d, 0, 4) << "\n"; // -10 (cealalta parte)
return 0;
}Expresia a·x + b·y + c e un singur număr pe care îl recitești de trei ori:
zero → punctul e pe dreaptă; pozitiv → o jumătate de plan; negativ →
cealaltă jumătate. Două puncte sunt de aceeași parte exact când valorile lor au
același semn (produsul lor > 0).
- Folosești
y = mx + nși pici la verticale: pentrux = 5panta nu există; forma generală o scrie ca1·x + 0·y - 5 = 0, fără excepții. - Overflow fără
long long: produselea·pxșib·pycresc repede la coordonate mari. Peintpoți depăși; ține totul pelong long. - Confuzi
acub: reținea = y2 - y1(diferența pe Y) șib = x1 - x2(diferența pe X, inversată). Schimbarea lor între ele rotește dreapta greșit. - Crezi că
(a, b, c)e unic: dreapta poate fi scalată.4·x - 2·y - 2 = 0și2·x - y - 1 = 0sunt aceeași dreaptă. Nu compara coeficienții direct; pentru egalitate testează dacă punctele uneia satisfac ecuația celeilalte.
| f(P) | -10 | 0 | 12 | |||
R(0 | 4) | P(2 | 3) | Q(4 | 1) | |
negativ | zero | pozitiv |
Recapitulare
- Forma generală
a·x + b·y + c = 0reprezintă orice dreaptă, inclusiv cele verticale, și cu coordonate întregi dăa,b,cîntregi fără împărțire. - Din două puncte:
a = y2 - y1,b = x1 - x2,c = -(a·x1 + b·y1); ține totul pelong longca să eviți overflow-ul. - Evaluezi
a·x + b·y + cîntr-un punct: zero = pe dreaptă, iar semnul spune în ce jumătate de plan se află punctul.