Ecuația dreptei — forma generală ax + by + c = 0

Mediu~16 min9 pași

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 - y1
  • b = x1 - x2
  • c = -(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 = 4
  • b = x1 - x2 = 1 - 3 = -2
  • c = -(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 parte
  • R(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;
}
Observația-cheie

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).

Greșeli frecvente
  • Folosești y = mx + n și pici la verticale: pentru x = 5 panta nu există; forma generală o scrie ca 1·x + 0·y - 5 = 0, fără excepții.
  • Overflow fără long long: produsele a·px și b·py cresc repede la coordonate mari. Pe int poți depăși; ține totul pe long long.
  • Confuzi a cu b: reține a = y2 - y1 (diferența pe Y) și b = 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 și 2·x - y - 1 = 0 sunt 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
Aceeași expresie f(P) = 4·px − 2·py − 2 pentru trei puncte: semnul spune partea, zero spune „pe dreaptă”.

Recapitulare

  • Forma generală a·x + b·y + c = 0 reprezintă 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 pe long long ca 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.

Întrebarea 1 / 3

De ce preferi forma generală `ax + by + c = 0` în locul formei `y = mx + n` în algoritmică?