Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.03 KB | None | 0 0
  1. function Check(x, y, yc, a, b, c, d: real): boolean;
  2. var
  3. ellipse, rhombus: boolean;
  4. begin
  5. ellipse := ((sqr(x) / sqr(a) + sqr(y - yc) / sqr(b)) <= 1) and (y - yc >= 0);
  6. rhombus := (abs(x) <= c) and (abs(y) <= d - abs(x) * d / c);
  7. result := ellipse and rhombus;
  8. end;
  9.  
  10. function MonteCarlo(am, bm, yc, a, b, c, d: real; n: integer): real;
  11. var
  12. x, y: real;
  13. i, k: integer;
  14. begin
  15. k := 0;
  16. for i := 0 to n do
  17. begin
  18. x := random * am * 2.0 - am;
  19. y := random * bm;// * 2.0 - bm;
  20. if Check(x, y, yc, a, b, c, d) then inc(k);
  21. end;
  22. result := 2.0 * am * bm * k / n;//4.0
  23. end;
  24.  
  25. function Rastr(am, bm, yc, a, b, c, d: real; n: integer): real;
  26. var
  27. hx, hy, x, y: real;
  28. k: integer;
  29. begin
  30. n := floor(sqrt(n));
  31. k := 0;
  32. hx := am * 2.0 / n;
  33. hy := bm / n;
  34. y := 0;
  35. while y <= bm do
  36. begin
  37. x := -am;
  38. while x <= am do
  39. begin
  40. if Check(x, y, yc, a, b, c, d) then inc(k);
  41. x := x + hx;
  42. end;
  43. y := y + hy;
  44. end;
  45. n := n * n;
  46. result := 2.0 * am * bm * k / n;
  47. end;
  48.  
  49. var
  50. a, b, c, d, y1, y2, x, am, bm, mm, mr: real;
  51.  
  52. begin
  53. Randomize;
  54. { a := 8;
  55. b := 4;
  56. d := 4;
  57. c := 6;
  58. y1 := 6;
  59. y2 := 4;}
  60. write('Задайте полуоси эллипса : ');
  61. readln(a, b);
  62. write('Ycenter = ');
  63. readln(y1);
  64. write('Задайте полудиагонали ромба : ');
  65. readln(d, c);
  66. write('Ycenter = ');
  67. readln(y2);
  68. x := 0;
  69. {Координату Y эллипса сдвинем на Y2, а Y2 опустим на 0,
  70. тогда ромб у нас будет в 0,0 , а эллипс на расстоянии y1-y2}
  71. y1 := y1 - y2;
  72. y2 := 0;
  73. am := max(a, c);//ширина
  74. bm := max(b, d);//высота
  75. mm := MonteCarlo(am, bm, y1, a, b, c, d, 1000000);
  76. mr := Rastr(am, bm, y1, a, b, c, d, 1000000);
  77. if mm + mr = 0 then writeln('Фигуры не пересекаются')
  78. else
  79. begin
  80. writeln('Площадь пересечения(Монте-Карло) = ', mm:0:8);
  81. writeln('Площадь пересечения(Метод растра) = ', mr:0:8);
  82. end;
  83. readln;
  84. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement