Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
2 / 2 / 0
Регистрация: 09.10.2017
Сообщений: 132

Определить радиус и центр окружности, проходящей по крайней мере через три точки множества

22.03.2018, 18:15. Показов 2911. Ответов 6

Студворк — интернет-сервис помощи студентам
Определить радиус и центр окружности, проходящей по крайней мере через три точки множества и содержащей внутри себя наибольшее количество точек
Прошу помочь с решением задачи.
У меня есть уже некоторые наработки
файл с данными xy1.txt
Недоделанный код.
Не знаю, как грамотно написать процедуру принадлежности и нахождения окружности, включающей в себя максимальное количество точек.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
program okr;
 
uses GraphABC;
const
   nmax = 120;
   r = 2;
 
type
   tPoint = record
      x, y: real;
   end;
   tVertex = record
      P0, P1, P2, P3: tPoint;
   end;
   tOkr = record//тип окружность, координаты центра и радиус
      o: tPoint;
      r: real;
   end;
   tStorage = record
      n: integer;
      T: array[1..nmax] of tPoint;//массив для точек
      O: array[1..nmax] of tOkr;//массив для окружностей
   end;
 
var
   name: string;
   x0, y0, r0: real;
   S1: tStorage;
   f1: text;
   NFirst, i, j, k, ires, jres, kres: integer;
 
procedure LoadPoints(var f: text; var S: tStorage);//загружаем координаты первого и первого множества
begin
   S.n := 0;
   while not eof(f) do 
   begin
      S.n := S.n + 1;
      readln(f, S.T[S.n].x, S.T[S.n].y);
   end;
end;
 
procedure DrawPoints(S: tStorage);//рисуем точки множества
var
   i: integer;
begin
   for i := 1 to S.n do
      Circle(round(S.T[i].x), round(S.T[i].y), r);
end;
 
procedure Okr1(P1, P2, P3: tPoint; var x0, y0, r0: real);//вычисляем параметры нужной окружности
var
   a, b, x, y: real;
   k0, k1, k2, m0, m1, m2: real;
begin
   k0 := sqr(P1.x) - sqr(P2.x) + sqr(P1.y) - sqr(P2.y);
   k1 := 2 * (P1.y - P2.y);
   k2 := 2 * (P1.x - P2.x);
   m0 := sqr(P1.x) - sqr(P3.x) + sqr(P1.y) - sqr(P3.y);
   m1 := 2 * (P1.y - P3.y);
   m2 := 2 * (P1.x - P3.x);
   a := k2 * m0 - k0 * m2;
   b := k2 * m1 - k1 * m2;
   if b <> 0 then 
      y0 := a / b;
   if abs(m2) > e then 
      x0 := (m0 - y0 * m1) / m2
   else if abs(k2) > e then 
      x0 := (k0 - y0 * k1) / k2;
   r0 := sqrt(sqr(P1.x - x0) + sqr(P1.y - y0));
end;
 
procedure FindTriplet(P1, P2: tPoint; S: tStorage; var ires, jres, kres: integer);//находим тройки координат
var
   i, j, k, m, n, max: integer;
   x, y, r,a, b: real;
begin
   for i := 1 to S.n-2 do
      for j := i + 1 to S.n-1 do
         for k := j + 1 to S.n do begin
            { Найти радиус и цент окр-и, проходящей через i-ю, j-ю, и k-ю точки }
               Okr1( S.T[i], S.T[j], S.T[k], x, y, r);
            {Подсчитать количество точек n, попадающих внутрь окр-ти с центром x, y и радиусом r }
               n := 0;
               for m := 1 to S.n do
                  if 
                     n := n + 1;
 
            {Сравнить n с текущим максимальным (?) и если n больше, то изменить максимальное и запомнить тройку точек }   
            
            
            ires := i;
            jres := j;
            kres := k;
         end;
         writeln (n);//выводим количество окружностей
end;
 
begin
   CenterWindow;
   writeln('Определить радиус и центр окружности, проходящей через три точки множества и содержащей внутри себя наибольшее количество точек');
   writeln('Файл с координатами множества?'); readln(name);
   assign(f1, name);
   reset(f1);
   LoadPoints(f1, S1); // Загрузка данных из файла
   SetPenColor(clRed);
   DrawPoints(S1);
   FindTriplet(S1, ires, jres, kres);
   DrawCircle(round(x0), round(y0), round(r0));//рисуем окружность
end.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.03.2018, 18:15
Ответы с готовыми решениями:

Определить радиус и центр окружности, проходящей по крайней мере через три различные точки
11. Определить радиус и центр окружности, проходящей по крайней мере через три различные точки заданного множества точек на плоскости и...

Определить радиус и центр окружности минимального радиуса, проходящей хотя бы через три различные точки заданн
Определить радиус и центр окружности минимального радиуса, проходящей хотя бы через три различные точки заданного множества точек на...

Найти центр и радиус окружности проходящей через три заданные точки на плоскости
Помогите пожалуйста решить задачу на паскале. Вот условие: Найти центр и радиус окружности проходящей через три заданные точки на...

6
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
22.03.2018, 19:13
Цитата Сообщение от taoariya Посмотреть сообщение
Не знаю, как грамотно написать процедуру принадлежности и нахождения окружности, включающей в себя максимальное количество точек.
Так я же Вам писал похожее
Выбрать три различные точки первого множества так, чтобы круг, ограниченный окружностью, проходящей через три точки
Здесь нужно выбрать окружность содержащую максимальное количество точек. А 4 точки что в файле, это очень мало.
1
2 / 2 / 0
Регистрация: 09.10.2017
Сообщений: 132
22.03.2018, 22:48  [ТС]
Вот, я дописала ее с помощью вашего кода
Но она почему-то только точки рисует.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
program okr;
 
uses GraphABC;
const
   nmax = 120;
   rad = 2; //радиус точек при рисовании
 
type
   tPoint = record
      x, y: real;
   end;
   tVertex = record
      P0, P1, P2, P3: tPoint;
   end;
   tOkr = record//тип окружность, координаты центра и радиус
      o: tPoint;
      r: real;
   end;
   tStorage = record
      n: integer;
      T: array[1..nmax] of tPoint;//массив для точек
      O: array[1..nmax] of tOkr;//массив для окружностей
   end;
    T = array[1..nmax] of tPoint;//массив для точек
    O = array[1..nmax] of tOkr;//массив для окружностей
var
   name: string;
   x0, y0, r0, x, y, r: real;
   S1: tStorage;
   ro: tOkr;
   f1: text;
   NFirst, i, j, k, ires, jres, kres, n, nn: integer;
 
procedure LoadPoints(var f: text; var S: tStorage);//загружаем координаты первого и первого множества
begin
   S.n := 0;
   while not eof(f) do 
   begin
      S.n := S.n + 1;
      readln(f, S.T[S.n].x, S.T[S.n].y);
   end;
end;
 
procedure DrawPoints(S: tStorage);//рисуем точки множества
var
   i: integer;
begin
   for i := 1 to S.n do
      Circle(round(S.T[i].x), round(S.T[i].y), rad);
end;
 
procedure Okr1(P1, P2, P3: tPoint; var x0, y0, r0: real);//вычисляем параметры нужной окружности
var
   a, b, x, y: real;
   k0, k1, k2, m0, m1, m2: real;
begin
   k0 := sqr(P1.x) - sqr(P2.x) + sqr(P1.y) - sqr(P2.y);
   k1 := 2 * (P1.y - P2.y);
   k2 := 2 * (P1.x - P2.x);
   m0 := sqr(P1.x) - sqr(P3.x) + sqr(P1.y) - sqr(P3.y);
   m1 := 2 * (P1.y - P3.y);
   m2 := 2 * (P1.x - P3.x);
   a := k2 * m0 - k0 * m2;
   b := k2 * m1 - k1 * m2;
   if b <> 0 then 
      y0 := a / b;
   if abs(m2) > e then 
      x0 := (m0 - y0 * m1) / m2
   else if abs(k2) > e then 
      x0 := (k0 - y0 * k1) / k2;
   r0 := sqrt(sqr(P1.x - x0) + sqr(P1.y - y0));
end;
 
procedure FindTriplet(S: tStorage; var ires, jres, kres: integer; ro: tOkr);//находим тройки координат
var
   i, j, k, m, n, nn, max, ko: integer;
   x0, y0, r0, a, b: real;
begin
   n := 0;
   ko := 0;
   nn := 0;
   max := 0;
   for i := 1 to S.n-2 do
      for j := i + 1 to S.n-1 do
         for k := j + 1 to S.n do begin
              ko := ko + 1; //считаем количество окружностей
            { Найти радиус и цент окр-и, проходящей через i-ю, j-ю, и k-ю точки }
               Okr1( S.T[i], S.T[j], S.T[k], x, y, r);
            {Подсчитать количество точек n, попадающих внутрь окр-ти с центром x, y и радиусом r }
               n := 0;
               for m := 1 to S.n do
                  if sqr (x0 - S.T[m].x) + sqr (y0 - S.T[m].y) <= r0*r0 then //квадрат расстояния между точкой и центром, не больше квадрата радиуса
                     n := n + 1;
            {Сравнить n с текущим максимальным (?) и если n больше, то изменить максимальное и запомнить тройку точек }   
            if n > max then begin
               n := max;
               ires := i;
               jres := j;
               kres := k;
            end;
             nn := S.n - n;
         //writeln (n);
         end;
end;
 
begin
   CenterWindow;
   //writeln('Определить радиус и центр окружности, проходящей через три точки множества и содержащей внутри себя наибольшее количество точек');
   writeln('Файл с координатами множества?'); readln(name);
   assign(f1, name);
   reset(f1);
   LoadPoints(f1, S1); // Загрузка данных из файла
   SetPenColor(clRed);
   DrawPoints(S1);
   writeln (ires, jres, kres);
   FindTriplet(S1, ires, jres, kres, ro);
   writeln (x0, y0, r0);
   DrawCircle(round(x0), round(y0), round(r0));//рисуем окружность
   writeln ('Точек внутри: ', n); writeln ('Точек снаружи: ', nn);
end.
вот собственно и сам файл xy.txt
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
23.03.2018, 11:30
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

А Вы в каком паскале пишете просто АВС или АВС.net? А то у Вас темы и там и там и просто в разделе Паскаль.

Добавлено через 2 часа 12 минут
Вот что-то написал в АВС.net.
Файл с точками создаю программно, координаты от -10 до 10, вещественные.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var f:text;
    x,y:real;
    i:integer;
begin
assign(f,'xy.txt');
rewrite(f);
randomize;
for i:=1 to 20 do
 begin
  x:=-10+20*random;
  y:=-10+20*random;
  writeln(f,x:6:2,' ',y:6:2);
 end;
close(f);
writeln('Координаты записаны в файл xy.txt')
end.
Имея этот файл под рукой можно создавать разные файлы с разным количеством точек и с разными координатами.
Посмотрите программу, исправьте что не нравится или пишите я поправлю.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
uses GraphABC;
const nmax = 120; //зачем? можно просто дальше написать
                  //T=array[1..100] of tPoint;
      rad = 2; //радиус точек при рисовании
      e=0.001;//точность сравнения вычисленных вещественных чисел
type tPoint=record
            x, y: real;
            end;
     tOkr=record//тип окружность, координаты центра и радиус
          o: tPoint;
          r: real;
          end;
     T=array[1..nmax] of tPoint;//массив для точек
var n:integer;//количество точек
    cn:integer;//центр графического окна
    ms:real;//масштаб для перевода реальных координат в экранные
procedure LoadPoints(var f:text;var p:T;var n:integer);//загружаем координаты множества
begin
n:=0;
while not eof(f) do
 begin
  n:=n+1;
  readln(f,p[n].x, p[n].y);
 end;
end;
procedure Okr1(P1,P2,P3:tPoint; var P0:tPoint;var r0:real);//вычисляем параметры нужной окружности
var a,b:real;
    k0,k1,k2,m0,m1,m2:real;
begin
k0:=sqr(P1.x)-sqr(P2.x)+sqr(P1.y)-sqr(P2.y);
k1:=2*(P1.y-P2.y);
k2:=2*(P1.x-P2.x);
m0:=sqr(P1.x)-sqr(P3.x)+sqr(P1.y)-sqr(P3.y);
m1:=2*(P1.y-P3.y);
m2:=2*(P1.x-P3.x);
a:=k2*m0-k0*m2;
b:=k2*m1-k1*m2;
if b<>0 then P0.y:= a/b;
if abs(m2)>e then P0.x:=(m0-P0.y*m1)/m2
else if abs(k2)>e then P0.x:=(k0-P0.y*k1)/k2;
r0:=sqrt(sqr(P1.x-P0.x)+sqr(P1.y-P0.y));
end;    
 
procedure FindTriplet(p:T; n:integer; var ires,jres,kres,max: integer; var ro: tOkr);//находим тройки координат
var ko:integer;
    P0:tPoint;
    r0:real;
begin
max:=0;
for var i:=1 to n-2 do
for var j:=i+1 to n-1 do
for var k:=j+1 to n do
 begin
 // Найти радиус и цент окр-и, проходящей через i-ю, j-ю, и k-ю точки
  Okr1( p[i],p[j],p[k],P0,r0);
  //Подсчитать количество точек ko, попадающих внутрь окр-ти с центром x, y и радиусом r
  ko:=0;
  for var m:=1 to n do
  //если точка не принадлежит исследуемым
  if not (m in[i,j,k])
  //и если квадрат расстояния между точкой и центром окружности не больше квадрата радиуса
  and(sqr(P0.x-p[m].x)+sqr(P0.y-p[m].y) <= r0*r0) then ko:=ko+1;//считаем только внутри
  //Сравнить ko с текущим максимальным и если ko больше, то изменить максимальное и запомнить тройку точек
  if ko>max then
   begin
    max:=ko;
    ro.o.x:=P0.x;
    ro.o.y:=P0.y;
    ro.r:=r0;
    ires:=i;
    jres:=j;
    kres:=k;
   end;
  end;
end;
 
procedure DrawPoints(p:T;n:integer);//рисуем координатную сетку и точки множества
begin
//масштаб
ms:=(cn-20)/20;
//оси
Line(0,cn,2*cn,cn);
TextOut(2*cn-20,cn-20,'X');
Line(cn,0,cn,2*cn);
TextOut(cn+5,0,'Y');
TextOut(cn+5,cn+10,'0');
//засечки и подписи по осям
for var i:=1 to 20 do
if i mod 2=0 then
 begin
  Line(cn+round(i*ms),cn-3,cn+round(i*ms),cn+3);
  Line(cn-round(i*ms),cn-3,cn-round(i*ms),cn+3);
  TextOut(cn+round(i*ms)-5,cn+10,inttostr(i));
  TextOut(cn-round(i*ms)-5,cn+10,inttostr(-i));
  Line(cn-5,cn-round(i*ms),cn+5,cn-round(i*ms));
  Line(cn-5,cn+round(i*ms),cn+5,cn+round(i*ms));
  TextOut(cn-25,cn-round(i*ms)-5,inttostr(i));
  TextOut(cn-25,cn+round(i*ms)-5,inttostr(-i));
 end;
SetBrushVolor(clBlack);
for var i:=1 to n do
 begin
  SetBrushstyle(bsSolid);
  Circle(cn+round(p[i].x*ms),cn-round(p[i].y*ms),rad);
  SetBrushStyle(bsClear);
  TextOut(cn+round(p[i].x*ms)+5,cn-round(p[i].y*ms)-5,inttostr(i));
 end; 
end;
 
var name: string;//имя файла
    f: text;//текстовый файл
    p:T;//массив точек
    i,j,k,max:integer;//счетчики
    o:tOkr;//окружность
    s1,s2:string;//строки для перевода вещественных чисел в нуный формат
                 //(не умею в АВС по другому)
begin
writeln('Введите имя файла с координатами точек');
readln(name);
assign(f,name);
if not fileexists(name) then
 begin
  writeln('Такой файл не найден');
  exit;
 end
else reset(f);
SetWindowSize(500,500);
CenterWindow;
ClearWindow;;
cn:=WindowWidth div 2;
LoadPoints(f,p,n);
Close(f);
DrawPoints(p,n);
FindTriplet(p,n,i,j,k,max,o);
SetPenColor(clRed);
SetBrushStyle(bsSolid);
Circle(cn+round(o.o.x*ms),cn-round(o.o.y*ms),rad);
SetBrushStyle(bsClear);
Circle(cn+round(o.o.x*ms),cn-round(o.o.y*ms),round(o.r*ms));
TextOut(10,10,'Окружность с максимальным');
TextOut(10,30,'количеством точек внутри');
TextOut(10,50,'проходит через точки '+inttostr(i)+';'+inttostr(j)+';'+inttostr(k));
TextOut(10,70,'Максимальное количество точек');
TextOut(10,90,'внутри окружности='+inttostr(max));
str(o.o.x:0:2,s1);
str(o.o.y:0:2,s2);
TextOut(10,110,'Координаты центра ('+s1+';'+s2+')');
str(o.r:0:2,s1);
TextOut(10,130,'Радиус='+s1);
end.
Добавлено через 19 минут
Кстати в АВС.net массив вообще можно создать динамический, тогда не нужно придумывать его размер.
1
2 / 2 / 0
Регистрация: 09.10.2017
Сообщений: 132
23.03.2018, 16:24  [ТС]
Мне обычный нужен, не АВС.net
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
23.03.2018, 16:32
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Господи, хоть что-то бы умели...
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
uses GraphABC,Crt;
const nmax = 120; //зачем? можно просто дальше написать
                  //T=array[1..100] of tPoint;
      rad = 2; //радиус точек при рисовании
      e=0.001;//точность сравнения вычисленных вещественных чисел
type tPoint=record
            x, y: real;
            end;
     tOkr=record//тип окружность, координаты центра и радиус
          o: tPoint;
          r: real;
          end;
     T=array[1..nmax] of tPoint;//массив для точек
var n:integer;//количество точек
    cn:integer;//центр графического окна
    ms:real;//масштаб для перевода реальных координат в экранные
procedure LoadPoints(var f:text;var p:T;var n:integer);//загружаем координаты множества
begin
n:=0;
while not eof(f) do
 begin
  n:=n+1;
  readln(f,p[n].x, p[n].y);
 end;
end;
procedure Okr1(P1,P2,P3:tPoint; var P0:tPoint;var r0:real);//вычисляем параметры нужной окружности
var a,b:real;
    k0,k1,k2,m0,m1,m2:real;
begin
k0:=sqr(P1.x)-sqr(P2.x)+sqr(P1.y)-sqr(P2.y);
k1:=2*(P1.y-P2.y);
k2:=2*(P1.x-P2.x);
m0:=sqr(P1.x)-sqr(P3.x)+sqr(P1.y)-sqr(P3.y);
m1:=2*(P1.y-P3.y);
m2:=2*(P1.x-P3.x);
a:=k2*m0-k0*m2;
b:=k2*m1-k1*m2;
if b<>0 then P0.y:= a/b;
if abs(m2)>e then P0.x:=(m0-P0.y*m1)/m2
else if abs(k2)>e then P0.x:=(k0-P0.y*k1)/k2;
r0:=sqrt(sqr(P1.x-P0.x)+sqr(P1.y-P0.y));
end;    
 
procedure FindTriplet(p:T; n:integer; var ires,jres,kres,max: integer; var ro: tOkr);//находим тройки координат
var i,j,k,m,ko:integer;
    P0:tPoint;
    r0:real;
begin
max:=0;
for i:=1 to n-2 do
for j:=i+1 to n-1 do
for k:=j+1 to n do
 begin
 // Найти радиус и цент окр-и, проходящей через i-ю, j-ю, и k-ю точки
  Okr1( p[i],p[j],p[k],P0,r0);
  //Подсчитать количество точек ko, попадающих внутрь окр-ти с центром x, y и радиусом r
  ko:=0;
  for m:=1 to n do
  //если точка не принадлежит исследуемым
  if not (m in[i,j,k])
  //и если квадрат расстояния между точкой и центром окружности не больше квадрата радиуса
  and(sqr(P0.x-p[m].x)+sqr(P0.y-p[m].y) <= r0*r0) then ko:=ko+1;//считаем только внутри
  //Сравнить ko с текущим максимальным и если ko больше, то изменить максимальное и запомнить тройку точек
  if ko>max then
   begin
    max:=ko;
    ro.o.x:=P0.x;
    ro.o.y:=P0.y;
    ro.r:=r0;
    ires:=i;
    jres:=j;
    kres:=k;
   end;
  end;
end;
 
procedure DrawPoints(p:T;n:integer);//рисуем координатную сетку и точки множества
var i:integer;
begin
//масштаб
ms:=(cn-20)/20;
//оси
Line(0,cn,2*cn,cn);
TextOut(2*cn-20,cn-20,'X');
Line(cn,0,cn,2*cn);
TextOut(cn+5,0,'Y');
TextOut(cn+5,cn+10,'0');
//засечки и подписи по осям
for i:=1 to 20 do
if i mod 2=0 then
 begin
  Line(cn+round(i*ms),cn-3,cn+round(i*ms),cn+3);
  Line(cn-round(i*ms),cn-3,cn-round(i*ms),cn+3);
  TextOut(cn+round(i*ms)-5,cn+10,inttostr(i));
  TextOut(cn-round(i*ms)-5,cn+10,inttostr(-i));
  Line(cn-5,cn-round(i*ms),cn+5,cn-round(i*ms));
  Line(cn-5,cn+round(i*ms),cn+5,cn+round(i*ms));
  TextOut(cn-25,cn-round(i*ms)-5,inttostr(i));
  TextOut(cn-25,cn+round(i*ms)-5,inttostr(-i));
 end;
SetBrushColor(clBlack);
for i:=1 to n do
 begin
  SetBrushstyle(bsSolid);
  Circle(cn+round(p[i].x*ms),cn-round(p[i].y*ms),rad);
  SetBrushStyle(bsClear);
  TextOut(cn+round(p[i].x*ms)+5,cn-round(p[i].y*ms)-5,inttostr(i));
 end; 
end;
 
var name: string;//имя файла
    f: text;//текстовый файл
    p:T;//массив точек
    i,j,k,max:integer;//счетчики
    o:tOkr;//окружность
    s1,s2:string;//строки для перевода вещественных чисел в нуный формат
                 //(не умею в АВС по другому)
begin
writeln('Введите имя файла с координатами точек');
readln(name);
assign(f,name);
if not fileexists(name) then
 begin
  writeln('Такой файл не найден');
  exit;
 end
else reset(f);
SetWindowSize(500,500);
CenterWindow;
ClearWindow;;
cn:=WindowWidth div 2;
LoadPoints(f,p,n);
Close(f);
DrawPoints(p,n);
FindTriplet(p,n,i,j,k,max,o);
SetPenColor(clRed);
SetBrushStyle(bsSolid);
Circle(cn+round(o.o.x*ms),cn-round(o.o.y*ms),rad);
SetBrushStyle(bsClear);
Circle(cn+round(o.o.x*ms),cn-round(o.o.y*ms),round(o.r*ms));
TextOut(10,10,'Окружность с максимальным');
TextOut(10,30,'количеством точек внутри');
TextOut(10,50,'проходит через точки '+inttostr(i)+';'+inttostr(j)+';'+inttostr(k));
TextOut(10,70,'Максимальное количество точек');
TextOut(10,90,'внутри окружности='+inttostr(max));
str(o.o.x:0:2,s1);
str(o.o.y:0:2,s2);
TextOut(10,110,'Координаты центра ('+s1+';'+s2+')');
str(o.r:0:2,s1);
TextOut(10,130,'Радиус='+s1);
end.
1
2 / 2 / 0
Регистрация: 09.10.2017
Сообщений: 132
23.03.2018, 16:47  [ТС]
Спасибо с:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2018, 16:47
Помогаю со студенческими работами здесь

Написать программу, определяющую радиус и центр окружности, проходящей по крайней мере через три различные точки заданного множества точек
Надо написать программу на СИ, определяюшую радиус и центр окружности, проходящей по крайней мере через три различные точки заданного...

Написать программу, определяющую радиус и центр окружности, проходящей по крайней мере через три различные точки заданного множества точек
Определить радиус и центр окружности, проходящей, по крайней мере, через три различные точки заданного множества точек на плоскости и,...

Пределить радиус и центр окружности, проходящей, по крайней мере, через три различные точки
Здравствуйте помогите пожалуйста над задачей бьюсь уже больше 2-х недель а толку 0 :-( Суть задачи: Определить радиус и центр...

Определить радиус и центр такой окружности, проходящей хотя бы через три разные точки множества точек
Определить радиус и центр такой окружности, проходящей хотя бы через три разные точки множества точек, минимального радиуса

Определить радиус и центр окружности минимального радиуса, проходящей хотя бы через три различные точки заданного множества точук на плоскости
Определить радиус и центр окружности минимального радиуса, проходящей хотя бы через три различные точки заданного множества точук на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru