program Trinagle; uses Crt, Graph; const eps = 0.00001; {Погрешность} n = 45; type tPoint = record {Точка} x: real; y: real; end; tLine = record {Отрезок} a: tPoint; b: tPoint; end; var amountP : array[1..50] of integer; {Количество точек, лежащих на отрезке} pointsN : integer; {Количество точек} lines : array[1..50] of tLine; {Множство лининй} points : array[1..10] of tPoint; {Множество точек} inF : text; {Входной файл} found : Boolean; {Найден искомый треугольник} i, j , k : integer; {Счетчики} GrDriver, GrMode, GrError : integer; {Графика} procedure OpenFile(var f: text); {Открытие файла} var name: string; err: integer; begin repeat WriteLn('Введите имя файла...'); ReadLn(name); Assign(f, name); {$i-} Reset(f); {$i+} err:= IOResult; if Err <> 0 then WriteLn('Файл не найден...'); until err = 0; WriteLn('Файл открыт успешно...'); Read(f, pointsN); end; procedure InputDots(var f: text); {Считывание точек} var i : integer; {Счетчик} begin for i:= 1 to pointsN do ReadLn(f, points[i].x, points[i].y); end; procedure Combinate(a: integer); {Генрация всех различных отрезков с концами} const {в заданном множестве точек} b = 2; {Количество концов отрезка} maxN = 100; {Количество возможных комбинаций} type intset = set of 1..maxN; var s : intset; n, m : integer; i, j, k: integer; o : array[1..maxN] of integer; procedure Print(var f: text; s: intset); var i: integer; j: integer; begin for i := 1 to n do if i in s then begin j:= j + 1; o[j]:= i; end; end; procedure Combinations(k, m: integer); var i: integer; begin if m = 0 then Print(inF, s) else if k >= m then begin Combinations(k - 1, m); s:= s + [k]; Combinations(k - 1, m - 1); s:= s - [k] end; end; begin n:= a; m:= b; s:= []; Combinations(n, m); for i:= 1 to maxn do begin k:= k + 1; if odd(i) then lines[k].a:= points[o[i]] else lines[k].b:= points[o[i]]; end; end; function EqPoints(a, b: tPoint): Boolean; {Равенство двух точек} begin EqPoints:= (abs(a.x - b.x) < eps) and (abs(a.y - b.y) < eps) end; function Includ(var a, b, c: tPoint): Boolean; {Проверка принадлежности} var {точки отрезку} p: real; begin if (not EqPoints(a, b)) and (not EqPoints(a, c)) and (not EqPoints(c, b)) then p:= (a.x - c.x)/(b.x-c.x) else p:= 1 + 1; Includ:= (abs((p*b.y + (1 - p)*c.y) - a.y) < eps) and (0 <= p) and (p <= 1) end; procedure NumPo; var i, j, n: integer; begin for i:= 1 to 50 do begin for j:= 1 to 10 do if Includ(points[j], lines[i].a, lines[i].b) then n:= n + 1; amountP[i]:= n; end; end; procedure Sort(var a: array of integer); {Сортировка массива} const {по невозрастанию} n = 50; var i, j: integer; {Счетчики} b : integer; {Буфер} buf : tLine; begin for i:= 1 to n - 1 do for j:= 1 to n - 1 do if a[j] < a[j + 1] then begin b:= a[j]; buf:= lines[j]; a[j]:= a[j + 1]; lines[j]:= lines[j + 1]; a[j + 1]:= b; lines[j + 1]:= buf end; writeln; for i:= 1 to n do write(a[i]); end; function TriBeing(l1, l2, l3: tLine): Boolean; {Cуществование треугольника} var {с заданными сторонами} c: integer; p: array[1..6] of tPoint; i, j: integer; begin p[1]:=l1.a; p[2]:=l1.b; p[3]:=l2.a; p[4]:=l2.b; p[5]:=l3.a; p[6]:=l3.b; for i:= 1 to 6 do for j:= 1 to 6 do if Eqpoints(p[i], p[j]) then c:= c + 1; TriBeing:= (c = 12) and (not Includ(l1.a, l1.b, l2.b)) and (not Includ(l1.b, l1.a, l2.b)) and (not Includ(l2.b, l1.a, l1.b)); end; procedure DrawDots; const r = 2; {Радиус точки} left = 4; {Отступ слева} top = 3; {Отступ сверху} var i : integer; {Счетчик} num: string; {Номер точки} begin for i:= 1 to pointsN do begin Circle(Trunc(points[i].x), Trunc(points[i].y), r); Str(i, num); OutTextXY(Trunc(points[i].x) + left, Trunc(points[i].y) + top, num) end; end; procedure DrawTri(l1, l2, l3: tLine); {Рисование} begin {треугольника} SetColor(Red); Line(trunc(l1.a.x), trunc(l1.a.y), trunc(l1.b.x), trunc(l1.b.y)); Line(trunc(l2.a.x), trunc(l2.a.y), trunc(l2.b.x), trunc(l2.b.y)); Line(trunc(l3.a.x), trunc(l3.a.y), trunc(l3.b.x), trunc(l3.b.y)); end; begin OpenFile(inF); {Открытие файла} Combinate(10); InputDots(inF); NumPo; ReadLn; {Инициализация графики} GrDriver:= Detect; InitGraph(GrDriver, GrMode, 'C:\TP\BGI'); GrError:= GraphResult; if GrError <> GrOk then begin WriteLn('Ошибка инициализации графики'); Halt end; {Рисование} DrawDots; {Рисование точек} Sort(amountP); for i:= 1 to n do for j:= i + 1 to n do for k:= j + 1 to n do if TriBeing(lines[i], lines[j], lines[k]) then DrawTri(lines[i], lines[j], lines[k]); ReadLn; CloseGraph end.