25 / 25 / 24
Регистрация: 11.04.2010
Сообщений: 87
1

Радиус и центр окружности.

18.10.2010, 15:25. Показов 4372. Ответов 4
Метки нет (Все метки)

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

Точки можно ввести любым способом хоть с клавиатуры, хоть рандомно.
Для начала нужно найти центр круга, это делается по очереди перебирая все точки на плоскости!!!
Например взяли первую точку, дальше нужно посчитать длину от той точки которую мы взяли до всех остальных по очереди!!!Если найдем >=3 отрезка одинаковой длины(это относительно одинаковой так как малая вероятность что длинна отрезков будет идентично равна, лучше значения округлить)
Если нашли одну окружность это еще не означает что не может быть другой окружности, но задание стоит таким образом что нужно найти окружность которая
содержит в себе наибольшее количество точек множества!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.10.2010, 15:25
Ответы с готовыми решениями:

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

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

Вычислить радиус окружности по введённой с клавиатуры площади окружности
Напишите программу, которая вычисляет радиус окружности по введённой с клавиатуры площади...

Радиус окружности
Радиус окружности, вписанной в равносторонний треугольник, равен R. Составить программу для...

4
267 / 258 / 47
Регистрация: 08.10.2009
Сообщений: 554
18.10.2010, 15:50 2
есть решение на делфи, чуть позже выложу
1
Почетный модератор
64276 / 47575 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
18.10.2010, 16:14 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
uses crt;
const nmax=28;
      e=0.01;
type
Point=record {точка}
      x,y:real;{координаты}
      end;
Okruz=record {окружность}
      o:Point;{координаты центра}
      r:real;{радиус}
    end;
MassP=array[1..nmax] of Point; {множество-массив точек}
procedure Tochki(var t:MassP;var n:integer);{создание множества точек}
var i:integer;
begin
repeat
write('Количество точек 3 do ',nmax,' n=');
readln(n);
until n in [3..nmax];
for i:=1 to n do
 begin
  t[i].x:=10*random;
  t[i].y:=10*random;
 end;
write('X:');
for i:=1 to n do
write(t[i].x:5:2);
writeln;
write('Y:');
for i:=1 to n do
write(t[i].y:5:2);
writeln;
end;
{вычисление параметров окружности, проходящей через три точки}
procedure Okr(t1,t2,t3:Point;var ok:Okruz);
var a,b,x,y:real;
    k0,k1,k2,m0,m1,m2:real;
begin
k0:=sqr(t1.x)-sqr(t2.x)+sqr(t1.y)-sqr(t2.y);
k1:=2*(t1.y-t2.y);
k2:=2*(t1.x-t2.x);
m0:=sqr(t1.x)-sqr(t3.x)+sqr(t1.y)-sqr(t3.y);
m1:=2*(t1.y-t3.y);
m2:=2*(t1.x-t3.x);
a:=k2*m0-k0*m2;
b:=k2*m1-k1*m2;
if b=0 then exit;
y:=a/b;
ok.o.y:=y;
if abs(m2) > e then x:=(m0-y*m1)/m2
else
  if abs(k2) > e then x:=(k0-y*k1)/k2
  else exit;
ok.o.x:=x;
ok.r:=sqrt(sqr(t1.x-x)+sqr(t1.y-y));
end;
{определение принадлежности точки окружности}
function Prin(a:Point;ok:Okruz):boolean;
begin
if (sqr(a.x-ok.o.x)+sqr(a.y-ok.o.y))-sqr(ok.r)<-e then Prin:=true
else Prin:=false
end;
 
var t:MassP;
    ok:Okruz;
    n,i,j,k,l,kol,mx:integer;
    mxr,mxx,mxy:real;
begin
clrscr;
randomize;
Tochki(t,n);
mx:=0;
mxr:=0;
mxx:=0;
mxy:=0;
for i:=1 to n-2 do
for j:=i+1 to n-1 do
for k:=j+1 to n do
 begin
  Okr(t[i],t[j],t[k],ok);
  kol:=0;
  for l:=1 to n do
  if Prin(t[l],ok)then kol:=kol+1;
  if kol>mx then
   begin
    mx:=kol;
    mxr:=ok.r;
    mxx:=ok.o.x;
    mxy:=ok.o.y;
   end;
 end;
if mx=0 then write('Окружности, содержащей точки внутри нет!')
else
 begin
  writeln('Окружность: координаты центра x0=',mxx:0:2,' Y0=',mxy:0:2,' R=',mxr:0:2);
  writeln('Внутри точек=',mx);
 end;
readln;
end.
Добавлено через 49 секунд
yamilramilev, Ты выкладывай, сравним...
0
25 / 25 / 24
Регистрация: 11.04.2010
Сообщений: 87
18.10.2010, 18:34  [ТС] 4
Puporev,
Проверил результат, все совпадает. Спасибо
0
267 / 258 / 47
Регистрация: 08.10.2009
Сообщений: 554
18.10.2010, 19:40 5
Описанная_окружность делал по формулам отсюда.
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
152
153
154
155
program Triangle;
 
TYPE
  Points=array[1..2] of real;
  mat3=array[1..3,1..3] of real;
  mat4=array[1..4,1..4] of real;
var
    p:array[1..30] of points;
    i,j,k,l,{счетчики}
    n,{количество точек}
    vnutri,vne, {количество точек внутри и вне окружности}
    vnutriTemp, vneTemp {количество точек внутри и вне окружности, временные переменные}
   :integer;
    matr3:mat3;{квадратная матрица 3-го порядка}
    matr4:mat4; {квадратная матрица 4-го порядка}
    x0,y0,{центр окружности}
    a,b,c,{стороны треугольника}
    r,square,{радиус и площадь}
    det,{определитель}
    pol,{полупериметр}
    pk{подкоренное ввыражение, формуле герона}
    :real;
 
 
    {функция нахождения длины между точками}
    function dlina(p1,p2:points):real;
      begin
        dlina:=sqrt(sqr(p1[1]-p2[1])+sqr(p1[2]-p2[2]));
      end;
 
    {функция нахождения определителя 3-го порядка}
    function determine3(A:mat3):real;
      begin
      determine3:=a[1,1]*a[2,2]*a[3,3]+a[2,1]*a[3,2]*a[1,3]+
        a[3,1]*a[1,2]*a[2,3]-a[3,1]*a[2,2]*a[1,3]-a[2,1]*a[1,2]*a[3,3]-
        a[1,1]*a[3,2]*a[2,3];
      end;
 
 
   procedure GetMatr(a:mat4; var b:mat3; m:integer);
    { Вычеркивание из матрицы m-го столбца и первой строки, процедура нужнаая
    при нахождении определителя 4-го порядка }
    var
      i,j:integer;
    begin
      for i:=2 to 4 do
        for j:= 1 to 4 do
          begin
            if j=m
              then
                  continue
              else
                if j<m
                  then
                    b[i-1,j]:=a[i,j]
                  else
                    b[i-1,j-1]:=a[i,j];
          end;
    end;
 
    {определитель 4-го порядка}
    function determine4(A:mat4):real;
      var
        i,st:integer;
        tA:mat3;
        S:real;
      begin
        st:=1;
        s:=0;
        for i:= 1 to 4 do
          begin
            GetMatr(a,tA,i);
            s:=s+st*determine3(tA)*a[1,i];
            st:=st*(-1);
          end;
        determine4:=s;
      end;
 
 
 
begin
  { TODO -oUser -cConsole Main : Insert code here }
  {количество точек}
  writeln('Введите количество точек');
  readln(N);
 
  {ввод координат}
  for i:= 1 to N do
    begin
      writeln('Введите координаты  ',i,'-й вершины (x,y)');
      readln(p[i,1],p[i,2]);
    end;
 
    {инициализация переменных, точнее просто заполнение нулями}
    vnutri:=0;
    vne:=N;
    vnutriTemp:=0;
    vneTemp:=0;
    x0:=0;
    r:=0;
    y0:=0;
    square:=0;
    {перебор всех точек}
    for i:= 1 to N do
      for j:= 1 to N do
        for k:= 1 to N do
          {условие чтоб точки не совпадали}
          if (i<>j) and (i<>k) and (j<>k) then
            begin
             {нахождение площади и радиуса}
             a:=dlina(p[i],p[j]);
             b:=dlina(p[k],p[j]);
             c:=dlina(p[k],p[i]);
             pol:=(a+b+c)/2;
             pk:=pol*(pol-a)*(pol-b)*(pol-c);
             if pk<=0 then continue else square:=sqrt(pk);
             r:=(a*b*c)/(4*square);{радиус окружности}
              {цикл для перебора всех точек кроме точек треугольника}
              for l:= 1 to N do
                {четвертая точка чтоб не совпадала с точками треугольника}
                if  (l<>i) and (l<>j) and (l<>k)  then
                 begin
                 {заполнение матрицы}
                  matr4[1,1]:=sqr(p[l,1])+sqr(p[l,2]); matr4[1,2]:=p[l,1]; matr4[1,3]:=p[l,2]; matr4[1,4]:=1;
                  matr4[2,1]:=sqr(p[i,1])+sqr(p[i,2]); matr4[2,2]:=p[i,1]; matr4[2,3]:=p[i,2]; matr4[2,4]:=1;
                  matr4[3,1]:=sqr(p[j,1])+sqr(p[j,2]); matr4[3,2]:=p[j,1]; matr4[3,3]:=p[j,2]; matr4[3,4]:=1;
                  matr4[4,1]:=sqr(p[k,1])+sqr(p[k,2]); matr4[4,2]:=p[k,1]; matr4[4,3]:=p[k,2]; matr4[4,4]:=1;
                  det:=determine4(matr4);
                  {находим определитель и сравниваем знак}
                  if det>0 then inc(vneTemp) else inc(vnutriTemp);
                 end;
             {если при вершинах треугольника i,j,k разность точек минимальна
             то находим центр окрцжности }
             if abs(vne-vnutri)>abs(vneTemp-vnutriTemp)
                  then
                    begin
                      {нахождение центра окружности}
                      matr3[1,1]:=sqr(p[i,1])+sqr(p[i,2]); matr3[1,2]:=p[i,2]; matr3[1,3]:=1;
                      matr3[2,1]:=sqr(p[j,1])+sqr(p[j,2]); matr3[2,2]:=p[j,2]; matr3[2,3]:=1;
                      matr3[3,1]:=sqr(p[k,1])+sqr(p[k,2]); matr3[3,2]:=p[k,2]; matr3[3,3]:=1;
                      x0:=determine3(matr3)/(4*square);
                      matr3[1,2]:=p[i,1]; matr3[2,2]:=p[j,1]; matr3[3,2]:=p[k,1];
                      y0:=(-1)*(determine3(matr3))/(4*square);
                      vnutri:=vnutriTemp;
                      vne:=vneTemp;
                    end;
                vnutriTemp:=0;
                vneTemp:=0;
                end;
      {вывод данных}
      writeln('x0=',x0:5:3);
      writeln('y0=',y0:5:3);
      writeln('r=',r:5:3);
     readln;
end.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2010, 19:40
Помогаю со студенческими работами здесь

Дан радиус окружности
Найти длину окружности и площадь круга

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

Определить радиус описанной окружности.
Даны три стороны треугольника a, b, c. Определить радиус описанной окружности. a=11 b=17 c=22

Радиус окружности, вписанной в равносторонний треугольник
Радиус окружности, вписанной в равносторонний треугольник, равен R. Составить программу для...


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

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

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