Определение точек пересечения фигур
Вычислить с помощью любого вычислительного метода (сканирования, итераций и т.п.) две точки пересечения окружности и эллипса на рисунке заданного варианта и вывести полученный результат.
Точность вычисления принять равной 0.001.
Наработка:
Код:
program task05;
uses crt;
const a=23;
b=38;
r=30;
e=0.001;
p=1010;
type mas=array [1..p] of real;
var x:mas;
yo,yoa,yob,yoc,xo:real;
ye,xea,xeb,xec,xe:real;
kl,bl:real;
pixel1,pixel2:real;
i:real;
q:real;
p1:string;
n1,n2,n3:integer;
procedure x1x2(Var a1,b1,c1:real);{рассчитывает уравнение}
var x1,x2,d:real; {по виду ах^2+bх+с=0 }
begin
d:=b1*b1-4*a1*c1;
if (d>=0) and (a<>0) then begin
x1:=(-b1+sqrt(d))/(2*a1);
x2:=(-b1-sqrt(d))/(2*a1) end
else
if (a=0) and (b<>0) then begin
x1:=-c1/b1;
x2:=x1
end;
if d<0 then c1:=1
else c1:=0;
a1:=x1;
b1:=x2;
if c1=1 then writeln('Корней нет');
end;
{Уравнение окружности (дуги 1)}
function f(i:integer):real;
begin
f:=sqrt(sqr(r)-sqr(-1*(x[i])-xo))+yo;
end;
{Уравнение окружности (дуги 2)}
function f1(i:integer):real;
begin
f1:=abs(-sqrt(sqr(r)-sqr(x[i]-xo))+yo);
end;
{Уравнение эллипса (дуги)}
function f2(i:integer):real;
begin
f2:=abs(-sqrt(sqr(b)*(1-sqr((x[i]-xe)/a)))+ye);
end;
{Уравнение прямой}
function fl(xl:real):real;
begin
fl:=kl*xl+bl;
end;
{Формула трапеции}
function trapecia(at:real;bt:real;n:integer;q:integer):real;
var i:integer;
h,s,s1:real;
begin
if bt>at then begin h:=(bt-at)/n;
for i:=1 to n+1 do x[i]:=at+h*(i-1) end
else begin
h:=(at-bt)/n;
for i:=1 to n+1 do x[i]:=bt+h*(i-1) end;
s:=0;s1:=0;
if q=1 then begin
for i:=2 to n do s:=s+f(i);
s:=(s+(f(1)+f(n+1))/2)*h;
s1:=(abs(at-bt))*(fl(bt)+fl(at))/2 end;
if q=2 then begin
for i:=2 to n do s:=s+f1(i);
s:=(s+(f1(1)+f1(n+1))/2)*h;
h:=pixel1/n;
for i:=1 to n+1 do x[i]:=h*(i-1);
for i:=2 to n do s1:=s1+f2(i);
s1:=(s1+(f2(1)+f2(n+1))/2)*h+(32-pixel1)*abs(fl(pixel1))/2 end;
trapecia:=s-s1;
end;
{Формула Симпсона}
function simpson(as1:real;bs:real;n:integer;q:integer):real;
var i:integer;
h,s,s1:real;
begin
if bs>as1 then begin h:=(bs-as1)/n;
for i:=1 to n+1 do x[i]:=as1+h*(i-1) end
else begin h:=(1-bs)/n;
for i:=1 to n+1 do x[i]:=bs+h*(i-1) end;
s:=0;
if q=1 then begin
for i:=2 to n do
if (i mod 2)<>1 then s:=s+4*f(i)
else s:=s+2*f(i);
s:=(s+f(1)+f(n+1))*h/3;
s1:=(abs(as1-bs))*(fl(bs)+fl(as1))/2 end;
if q=2 then begin
for i:=2 to n do
if (i mod 2)<>1 then s:=s+4*f1(i)
else s:=s+2*f1(i);
s:=(s+f1(1)+f1(n+1))*h/3;
h:=pixel1/n;
for i:=1 to n+1 do x[i]:=h*(i-1);
for i:=2 to n do
if (i mod 2)<>1 then s1:=s1+4*f2(i)
else s1:=s1+2*f2(i);
s1:=(s1+f2(1)+f2(n+1))*h/3;
s1:=s1+(32-pixel1)*abs(fl(pixel1))/2 end;
simpson:=s-s1;
end;
{Формула прямоугольников}
function pr(ap:real;bp:real;n:integer;q:integer):real;
var i:integer;
h,s,s1:real;
begin
if bp>ap then begin h:=(bp-ap)/n;
for i:=1 to n+1 do x[i]:=ap+h*(i-1) end
else begin h:=(ap-bp)/n;
for i:=1 to n+1 do x[i]:=bp+h*(i-1) end;
s:=0;s1:=0;
if q=1 then begin
for i:=1 to n do s:=s+f(i);
s:=s*h;
s1:=(abs(ap-bp))*(fl(bp)+fl(ap))/2 end;
if q=2 then begin
for i:=1 to n do s:=s+f1(i);
s:=s*h;
h:=pixel1/n;
for i:=1 to n+1 do x[i]:=h*(i-1);
for i:=1 to n do s1:=s1+f2(i);
s1:=s1*h+(32-pixel1)*abs(fl(pixel1))/2 end;
pr:=s-s1;
end;
{Расчет точки пересечения прямой, эллипса и оси координат}
{Метод простых итераций}
procedure itera(Var xi:real);
Var xs,xp:real;
begin
xp:=0;xs:=25;
while abs(xs-xp)>e do begin xp:=xs;
xs:=a*sqrt(1-sqr((kl*xp+bl)/b))+xe;
end;
xi:=xs;
end;
{Метод половинного деления}
procedure scan(var xscan:real);
Var x1,x2,y1,y2,yi,xi:real;
begin
x1:=-36;x2:=-8;
while abs(x2-x1)>e do begin xi:=(x1+x2)/2;
y1:=sqrt(sqr(r)-sqr(x1-xo))+yo-kl*x1-bl;
y2:=sqrt(sqr(r)-sqr(x2-xo))+yo-kl*x2-bl;
yi:=sqrt(sqr(r)-sqr(xi-xo))+yo-kl*xi-bl;
if (y1*yi>0) then x1:=xi else x2:=xi
end;
xscan:=x1;
end;
begin
p1:='y';
while p1='y' do begin
clrscr;
{Разработка параметров объектов:}
{окружность (x+x0)^2+(y+y0)^2=R^2}
xo:=-8;
yoa:=1; //(y+y0)^2
yob:=20; //(y+y0)^2
yoc:=99.99999999; // y^2+20y+100
x1x2(yoa,yob,yoc);
yo:=yoa;{получили хо и уо - координаты центра окружности}
{эллипс (x-xэ)^2/a^2+(y-yэ)/b^2=0}
ye:=2;
xea:=1;
xeb:=-26;
xec:=168.999; //(sqr(10)-sqr(4.345351/19)*360); //169
x1x2(xea,xeb,xec);
xe:=xea;{получили хе и уе - координаты центра эллипса}
{прямая}
kl:=-0.809784;
bl:=15.4;
{Координата по методу итераций}
itera(pixel1);
{Координата по методу сканирования}
scan(pixel2);
writeln(' _____________________________________________________________________');
writeln('| Объект | Параметры объектов |');
writeln('|___________________|_________________________________________________|');
writeln('| Окружность | |');
writeln('| | x0=',xo,' y0=',yo,' |');
writeln('| | r=',r,' |');
writeln('|___________________|_________________________________________________|');
writeln('| Эллипс | | ');
writeln('| | x0=',xe,' y0=',ye,' |');
writeln('| | a=',a,' b=',b,' |');
writeln('|___________________|_________________________________________________|');
writeln('| Прямая | |');
writeln('| | x1=',pixel1,' y1=',fl(pixel1),' |');
writeln('| | x2=',pixel2,' y2=',fl(pixel2),' |');
writeln('|___________________|_________________________________________________|');
writeln('| Точность | eps=',e,' |');
writeln('|___________________|_________________________________________________|');
writeln(' ');
writeln('Нажмите любую клавишу для продолжения');
readkey;
clrscr;
writeln('Введите количество разбиений для фигуры А (от 100 до 999)');
readln(n1);
readln(n2);
readln(n3);
clrscr;
writeln(' ________________________________________________________________________');
writeln('| Фигура А |');
writeln('|________________________________________________________________________|');
writeln('|Число разбиений | Результат |');
writeln('|________________|_______________________________________________________|');
writeln('| n | А | В | С |');
writeln('|________________|______________|___________________|____________________|');
{Площадь (прямоугольник)}
q:=pr(pixel2,0,n1,1);
write(' ',n1,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel2,0,n1,1);
write(' ',q);
{Площадь (Симпсон)}
q:=simpson(pixel2,0,n1,1);
write(' ',q,' ');
{Площадь (прямоугольник)}
q:=pr(pixel2,0,n2,1);
write(' ',n2,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel2,0,n2,1);
write(' ',q);
{Площадь (Симпсон)}
q:=simpson(pixel2,0,n2,1);
write(' ',q,' ');
{Площадь (прямоугольник)}
q:=pr(pixel2,0,n3,1);
write(' ',n3,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel2,0,n3,1);
write(' ',q);
{Площадь (Симпсон)}
q:=simpson(pixel2,0,n3,1);
writeln(' ',q,' ');
writeln('________________________________________________________________________');
readkey;
//clrscr;
writeln('Введите количество разбиений для фигуры В (от 100 до 999)');
readln(n1);
readln(n2);
readln(n3);
clrscr;
writeln(' ________________________________________________________________________');
writeln('| Фигура B |');
writeln('|________________________________________________________________________|');
writeln('|Число разбиений | Результат |');
writeln('|________________|_______________________________________________________|');
writeln('| n | А | В | С |');
writeln('|________________|______________|___________________|____________________|');
{Площадь (прямоугольник)}
q:=pr(pixel1,0,n1,1);
write('| ',n1,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel1,0,n1,1);
write('| ',q);
{Площадь (Симпсон)}
q:=simpson(pixel1,0,n1,1);
writeln('| ',q,' ');
{Площадь (прямоугольник)}
q:=pr(pixel1,0,n2,1);
write('| ',n2,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel1,0,n2,1);
write('| ',q);
{Площадь (Симпсон)}
q:=simpson(pixel1,0,n2,1);
write('| ',q,' ');
{Площадь (прямоугольник)}
q:=pr(pixel1,0,n3,1);
write('| ',n3,' |',q);
{Площадь (трапеция)}
q:=trapecia(pixel1,0,n3,1);
write('| |',q);
{Площадь (Симпсон)}
q:=simpson(pixel1,0,n3,1);
writeln('| |',q,'| |');
writeln('|________________________________________________________________________|');
writeln(' ');
readkey;
repeat
writeln('Continue...?(y/n)');
readln(p1);
clrscr
until (p1='y') or (p1='n');
end;
end.
uses crt;
const a=23;
b=38;
r=30;
e=0.001;
p=1010;
type mas=array [1..p] of real;
var x:mas;
yo,yoa,yob,yoc,xo:real;
ye,xea,xeb,xec,xe:real;
kl,bl:real;
pixel1,pixel2:real;
i:real;
q:real;
p1:string;
n1,n2,n3:integer;
procedure x1x2(Var a1,b1,c1:real);{рассчитывает уравнение}
var x1,x2,d:real; {по виду ах^2+bх+с=0 }
begin
d:=b1*b1-4*a1*c1;
if (d>=0) and (a<>0) then begin
x1:=(-b1+sqrt(d))/(2*a1);
x2:=(-b1-sqrt(d))/(2*a1) end
else
if (a=0) and (b<>0) then begin
x1:=-c1/b1;
x2:=x1
end;
if d<0 then c1:=1
else c1:=0;
a1:=x1;
b1:=x2;
if c1=1 then writeln('Корней нет');
end;
{Уравнение окружности (дуги 1)}
function f(i:integer):real;
begin
f:=sqrt(sqr(r)-sqr(-1*(x[i])-xo))+yo;
end;
{Уравнение окружности (дуги 2)}
function f1(i:integer):real;
begin
f1:=abs(-sqrt(sqr(r)-sqr(x[i]-xo))+yo);
end;
{Уравнение эллипса (дуги)}
function f2(i:integer):real;
begin
f2:=abs(-sqrt(sqr(b)*(1-sqr((x[i]-xe)/a)))+ye);
end;
{Уравнение прямой}
function fl(xl:real):real;
begin
fl:=kl*xl+bl;
end;
{Формула трапеции}
function trapecia(at:real;bt:real;n:integer;q:integer):real;
var i:integer;
h,s,s1:real;
begin
if bt>at then begin h:=(bt-at)/n;
for i:=1 to n+1 do x[i]:=at+h*(i-1) end
else begin
h:=(at-bt)/n;
for i:=1 to n+1 do x[i]:=bt+h*(i-1) end;
s:=0;s1:=0;
if q=1 then begin
for i:=2 to n do s:=s+f(i);
s:=(s+(f(1)+f(n+1))/2)*h;
s1:=(abs(at-bt))*(fl(bt)+fl(at))/2 end;
if q=2 then begin
for i:=2 to n do s:=s+f1(i);
s:=(s+(f1(1)+f1(n+1))/2)*h;
h:=pixel1/n;
for i:=1 to n+1 do x[i]:=h*(i-1);
for i:=2 to n do s1:=s1+f2(i);
s1:=(s1+(f2(1)+f2(n+1))/2)*h+(32-pixel1)*abs(fl(pixel1))/2 end;
trapecia:=s-s1;
end;
{Формула Симпсона}
function simpson(as1:real;bs:real;n:integer;q:integer):real;
var i:integer;
h,s,s1:real;
begin
if bs>as1 then begin h:=(bs-as1)/n;
for i:=1 to n+1 do x[i]:=as1+h*(i-1) end
else begin h:=(1-bs)/n;
for i:=1 to n+1 do x[i]:=bs+h*(i-1) end;
s:=0;
if q=1 then begin
for i:=2 to n do
if (i mod 2)<>1 then s:=s+4*f(i)
else s:=s+2*f(i);
s:=(s+f(1)+f(n+1))*h/3;
s1:=(abs(as1-bs))*(fl(bs)+fl(as1))/2 end;
if q=2 then begin
for i:=2 to n do
if (i mod 2)<>1 then s:=s+4*f1(i)
else s:=s+2*f1(i);
s:=(s+f1(1)+f1(n+1))*h/3;
h:=pixel1/n;
for i:=1 to n+1 do x[i]:=h*(i-1);
for i:=2 to n do
if (i mod 2)<>1 then s1:=s1+4*f2(i)
else s1:=s1+2*f2(i);
s1:=(s1+f2(1)+f2(n+1))*h/3;
s1:=s1+(32-pixel1)*abs(fl(pixel1))/2 end;
simpson:=s-s1;
end;
{Формула прямоугольников}
function pr(ap:real;bp:real;n:integer;q:integer):real;
var i:integer;
h,s,s1:real;
begin
if bp>ap then begin h:=(bp-ap)/n;
for i:=1 to n+1 do x[i]:=ap+h*(i-1) end
else begin h:=(ap-bp)/n;
for i:=1 to n+1 do x[i]:=bp+h*(i-1) end;
s:=0;s1:=0;
if q=1 then begin
for i:=1 to n do s:=s+f(i);
s:=s*h;
s1:=(abs(ap-bp))*(fl(bp)+fl(ap))/2 end;
if q=2 then begin
for i:=1 to n do s:=s+f1(i);
s:=s*h;
h:=pixel1/n;
for i:=1 to n+1 do x[i]:=h*(i-1);
for i:=1 to n do s1:=s1+f2(i);
s1:=s1*h+(32-pixel1)*abs(fl(pixel1))/2 end;
pr:=s-s1;
end;
{Расчет точки пересечения прямой, эллипса и оси координат}
{Метод простых итераций}
procedure itera(Var xi:real);
Var xs,xp:real;
begin
xp:=0;xs:=25;
while abs(xs-xp)>e do begin xp:=xs;
xs:=a*sqrt(1-sqr((kl*xp+bl)/b))+xe;
end;
xi:=xs;
end;
{Метод половинного деления}
procedure scan(var xscan:real);
Var x1,x2,y1,y2,yi,xi:real;
begin
x1:=-36;x2:=-8;
while abs(x2-x1)>e do begin xi:=(x1+x2)/2;
y1:=sqrt(sqr(r)-sqr(x1-xo))+yo-kl*x1-bl;
y2:=sqrt(sqr(r)-sqr(x2-xo))+yo-kl*x2-bl;
yi:=sqrt(sqr(r)-sqr(xi-xo))+yo-kl*xi-bl;
if (y1*yi>0) then x1:=xi else x2:=xi
end;
xscan:=x1;
end;
begin
p1:='y';
while p1='y' do begin
clrscr;
{Разработка параметров объектов:}
{окружность (x+x0)^2+(y+y0)^2=R^2}
xo:=-8;
yoa:=1; //(y+y0)^2
yob:=20; //(y+y0)^2
yoc:=99.99999999; // y^2+20y+100
x1x2(yoa,yob,yoc);
yo:=yoa;{получили хо и уо - координаты центра окружности}
{эллипс (x-xэ)^2/a^2+(y-yэ)/b^2=0}
ye:=2;
xea:=1;
xeb:=-26;
xec:=168.999; //(sqr(10)-sqr(4.345351/19)*360); //169
x1x2(xea,xeb,xec);
xe:=xea;{получили хе и уе - координаты центра эллипса}
{прямая}
kl:=-0.809784;
bl:=15.4;
{Координата по методу итераций}
itera(pixel1);
{Координата по методу сканирования}
scan(pixel2);
writeln(' _____________________________________________________________________');
writeln('| Объект | Параметры объектов |');
writeln('|___________________|_________________________________________________|');
writeln('| Окружность | |');
writeln('| | x0=',xo,' y0=',yo,' |');
writeln('| | r=',r,' |');
writeln('|___________________|_________________________________________________|');
writeln('| Эллипс | | ');
writeln('| | x0=',xe,' y0=',ye,' |');
writeln('| | a=',a,' b=',b,' |');
writeln('|___________________|_________________________________________________|');
writeln('| Прямая | |');
writeln('| | x1=',pixel1,' y1=',fl(pixel1),' |');
writeln('| | x2=',pixel2,' y2=',fl(pixel2),' |');
writeln('|___________________|_________________________________________________|');
writeln('| Точность | eps=',e,' |');
writeln('|___________________|_________________________________________________|');
writeln(' ');
writeln('Нажмите любую клавишу для продолжения');
readkey;
clrscr;
writeln('Введите количество разбиений для фигуры А (от 100 до 999)');
readln(n1);
readln(n2);
readln(n3);
clrscr;
writeln(' ________________________________________________________________________');
writeln('| Фигура А |');
writeln('|________________________________________________________________________|');
writeln('|Число разбиений | Результат |');
writeln('|________________|_______________________________________________________|');
writeln('| n | А | В | С |');
writeln('|________________|______________|___________________|____________________|');
{Площадь (прямоугольник)}
q:=pr(pixel2,0,n1,1);
write(' ',n1,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel2,0,n1,1);
write(' ',q);
{Площадь (Симпсон)}
q:=simpson(pixel2,0,n1,1);
write(' ',q,' ');
{Площадь (прямоугольник)}
q:=pr(pixel2,0,n2,1);
write(' ',n2,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel2,0,n2,1);
write(' ',q);
{Площадь (Симпсон)}
q:=simpson(pixel2,0,n2,1);
write(' ',q,' ');
{Площадь (прямоугольник)}
q:=pr(pixel2,0,n3,1);
write(' ',n3,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel2,0,n3,1);
write(' ',q);
{Площадь (Симпсон)}
q:=simpson(pixel2,0,n3,1);
writeln(' ',q,' ');
writeln('________________________________________________________________________');
readkey;
//clrscr;
writeln('Введите количество разбиений для фигуры В (от 100 до 999)');
readln(n1);
readln(n2);
readln(n3);
clrscr;
writeln(' ________________________________________________________________________');
writeln('| Фигура B |');
writeln('|________________________________________________________________________|');
writeln('|Число разбиений | Результат |');
writeln('|________________|_______________________________________________________|');
writeln('| n | А | В | С |');
writeln('|________________|______________|___________________|____________________|');
{Площадь (прямоугольник)}
q:=pr(pixel1,0,n1,1);
write('| ',n1,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel1,0,n1,1);
write('| ',q);
{Площадь (Симпсон)}
q:=simpson(pixel1,0,n1,1);
writeln('| ',q,' ');
{Площадь (прямоугольник)}
q:=pr(pixel1,0,n2,1);
write('| ',n2,' ',q);
{Площадь (трапеция)}
q:=trapecia(pixel1,0,n2,1);
write('| ',q);
{Площадь (Симпсон)}
q:=simpson(pixel1,0,n2,1);
write('| ',q,' ');
{Площадь (прямоугольник)}
q:=pr(pixel1,0,n3,1);
write('| ',n3,' |',q);
{Площадь (трапеция)}
q:=trapecia(pixel1,0,n3,1);
write('| |',q);
{Площадь (Симпсон)}
q:=simpson(pixel1,0,n3,1);
writeln('| |',q,'| |');
writeln('|________________________________________________________________________|');
writeln(' ');
readkey;
repeat
writeln('Continue...?(y/n)');
readln(p1);
clrscr
until (p1='y') or (p1='n');
end;
end.
спаасибо за активную помощь, ребята
всегда пожалуйста, дурачок. Если что обращайся еще.
иди нахуй
Цитата: Dinis Shirvanov
иди нахуй
что дурачок, проблемы с головкой? бобо? обратись к докторам. И обязательно и всегда пользуйся презервативами. А еще лучше убейся молодым - этим ты несомненно окажешь величайшую услугу человечеству. Это собственно единственное пожалуй, в чем от тебя может быть польза. :)