Определить радиус и центр окружности - Pascal ABC
Формулировка задачи:
Я криворукая видимо. Не получается программу написать. Помогите, пожалуйста!
Задача: определить радиус и центр такой окружности, проходящей хотябы через три различные точки заданного множества точек на плоскости, что минимальна разность количеств точек, лежащих внутри и вне окружности.
в абс надо
и хорошо б без рекурсии, но это на самом деле не принципиально.
заранее очень благодарна
Решение задачи: «Определить радиус и центр окружности»
textual
Листинг программы
uses crt;
const nmax=50;
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 дo ',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,k1,k2,mn,vn,nr:integer;
r,x,y:real;
begin
randomize;
Tochki(t,n);
mn:=n;
r:=0;
x:=0;
y:=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);
k1:=0;k2:=0;
for l:=1 to n do
if Prin(t[l],ok)then k1:=k1+1 {считаем внутри}
else k2:=k2+1;{снаружи}
if abs(k1-k2)<mn then{если разность меньше, запоминаем все параметры}
begin
mn:=abs(k1-k2);
r:=ok.r;
x:=ok.o.x;
y:=ok.o.y;
vn:=k1;
nr:=k2-3;
end;
end;
writeln('Окружность: координаты центра x0=',x:0:2,' Y0=',y:0:2,' R=',r:0:2);
writeln('Внутри точек=',vn,' снаружи=',nr);
end.
Объяснение кода листинга программы
- Объединение множества точек в массив с помощью функции Tochki.
- Вычисление параметров окружности, проходящей через три точки, с помощью функции Okr.
- Определение принадлежности точки окружности с помощью функции Prin.
- Поиск радиуса и центра окрузии, проходящей через три точки, с помощью вложенных циклов и функций Okr и Prin.
- Вывод результатов на экран с помощью функции writeln.