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

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

22.03.2018, 18:15. Показов 1954. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2018, 18:15
Ответы с готовыми решениями:

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

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

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

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

6
Почетный модератор
64086 / 47495 / 32734
Регистрация: 18.05.2008
Сообщений: 115,182
22.03.2018, 19:13 2
Цитата Сообщение от taoariya Посмотреть сообщение
Не знаю, как грамотно написать процедуру принадлежности и нахождения окружности, включающей в себя максимальное количество точек.
Так я же Вам писал похожее
Выбрать три различные точки первого множества так, чтобы круг, ограниченный окружностью, проходящей через три точки
Здесь нужно выбрать окружность содержащую максимальное количество точек. А 4 точки что в файле, это очень мало.
1
2 / 2 / 0
Регистрация: 09.10.2017
Сообщений: 132
22.03.2018, 22:48  [ТС] 3
Вот, я дописала ее с помощью вашего кода
Но она почему-то только точки рисует.
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
Почетный модератор
64086 / 47495 / 32734
Регистрация: 18.05.2008
Сообщений: 115,182
23.03.2018, 11:30 4
Лучший ответ Сообщение было отмечено 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  [ТС] 5
Мне обычный нужен, не АВС.net
0
Почетный модератор
64086 / 47495 / 32734
Регистрация: 18.05.2008
Сообщений: 115,182
23.03.2018, 16:32 6
Лучший ответ Сообщение было отмечено 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  [ТС] 7
Спасибо с:
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2018, 16:47

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru