Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function Check(x, y, yc, a, b, c, d: real): boolean;
- var
- ellipse, rhombus: boolean;
- begin
- ellipse := ((sqr(x) / sqr(a) + sqr(y - yc) / sqr(b)) <= 1) and (y - yc >= 0);
- rhombus := (abs(x) <= c) and (abs(y) <= d - abs(x) * d / c);
- result := ellipse and rhombus;
- end;
- function MonteCarlo(am, bm, yc, a, b, c, d: real; n: integer): real;
- var
- x, y: real;
- i, k: integer;
- begin
- k := 0;
- for i := 0 to n do
- begin
- x := random * am * 2.0 - am;
- y := random * bm;// * 2.0 - bm;
- if Check(x, y, yc, a, b, c, d) then inc(k);
- end;
- result := 2.0 * am * bm * k / n;//4.0
- end;
- function Rastr(am, bm, yc, a, b, c, d: real; n: integer): real;
- var
- hx, hy, x, y: real;
- k: integer;
- begin
- n := floor(sqrt(n));
- k := 0;
- hx := am * 2.0 / n;
- hy := bm / n;
- y := 0;
- while y <= bm do
- begin
- x := -am;
- while x <= am do
- begin
- if Check(x, y, yc, a, b, c, d) then inc(k);
- x := x + hx;
- end;
- y := y + hy;
- end;
- n := n * n;
- result := 2.0 * am * bm * k / n;
- end;
- var
- a, b, c, d, y1, y2, x, am, bm, mm, mr: real;
- begin
- Randomize;
- { a := 8;
- b := 4;
- d := 4;
- c := 6;
- y1 := 6;
- y2 := 4;}
- write('Задайте полуоси эллипса : ');
- readln(a, b);
- write('Ycenter = ');
- readln(y1);
- write('Задайте полудиагонали ромба : ');
- readln(d, c);
- write('Ycenter = ');
- readln(y2);
- x := 0;
- {Координату Y эллипса сдвинем на Y2, а Y2 опустим на 0,
- тогда ромб у нас будет в 0,0 , а эллипс на расстоянии y1-y2}
- y1 := y1 - y2;
- y2 := 0;
- am := max(a, c);//ширина
- bm := max(b, d);//высота
- mm := MonteCarlo(am, bm, y1, a, b, c, d, 1000000);
- mr := Rastr(am, bm, y1, a, b, c, d, 1000000);
- if mm + mr = 0 then writeln('Фигуры не пересекаются')
- else
- begin
- writeln('Площадь пересечения(Монте-Карло) = ', mm:0:8);
- writeln('Площадь пересечения(Метод растра) = ', mr:0:8);
- end;
- readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement