(* Exemplu de algoritmi pentru calcularea pozitiei reciproce a dreptelor si punctelor. *) Uses crt; Type Coordonata = real; Dreapta = record A, B, C: Coordonata; end; Punct = array[1..2] of Coordonata; Var p, l: Dreapta; S, Q: Punct; i, j: integer; procedure Cit_dreapta(var w: Dreapta); begin Write('A, B, C: '); with w do Readln(A, B, C); end; Procedure Cit_punct(var w: Punct); begin Write('x, y: '); readln(w[1], w[2]); end; Procedure Ec_Dr(S, Q: punct; var d: dreapta); begin with d do begin A := Q[2]-Q[1]; B := S[1]-S[2]; C := S[2]*Q[1]-S[1]*Q[2]; end; end; function Poz_Punct(p: punct; d: dreapta): integer; {Functia intoarce 1, -1 sau 0, corespunzator pozitiei punctului p fata de dreapta d } var i: Coordonata; begin with d do i := A*p[1]+B*p[2]+C ; if i <> 0 then i := i / abs(i); Poz_Punct := round(i); end; procedure write_dr(d: dreapta; nume: string); begin with d do writeln(nume,': A=',A:5:0,', B=',B:5:0,', C=',C:5:0); end; BEGIN clrscr; { 1) } writeln; Writeln('Introduceti coeficientii dreptelor!'); Writeln('p: '); cit_dreapta(p); writeln; Writeln('Introduceti coordonatele punctelor!'); Writeln('S: '); cit_punct(S); Writeln('Q: '); cit_punct(Q); { 2) } writeln; Writeln('SQ = l'); Ec_Dr(S, Q, l); write_dr(l, 'l'); { 3) } writeln; Write('Punctul S se afla '); i := poz_punct(S, p); j := poz_punct(Q, p); if (i<>0) and (j<>0) then begin if i = j then write('de aceasi parte ') else write('de cealalta parte '); writeln('a dreptei p fata de punctul Q!'); end else if i <> j then begin if i = 0 then writeln ('Punctul S se afla pe dreapta p, iar Q nu!') else writeln ('Punctul Q se afla pe dreapta p, iar S nu!') end else writeln('Punctele S si Q se afla pe dreapta p!'); readkey; END.