Найти площадь треугольника методом Монте-Карло (рекурсии) - Lisp

Узнай цену своей работы

Формулировка задачи:

Заданы координаты вершин треугольника. Найти площадь треугольника методом Монте-Карло и определить точность. Метод Монте-Карло заключается в том чтобы взять в прямоугольник этот треугольник, ткнуть в рандомное место на прямоугольнике и определить принадлежит ли оно треугольнику. Делать все нужно с помощью рекурсии. Больше не понял. Помогите!

Решение задачи: «Найти площадь треугольника методом Монте-Карло (рекурсии)»

textual
Листинг программы
(defun monte-carlo (n w x1 y1 x2 y2 x3 y3 xmin dx ymin dy k)
    (if (zerop n) k
        (let ((rx (+ xmin (random dx)))
              (ry (+ ymin (random dy))))
              (grwPset w rx ry _BLUE)
              (if (is-in rx ry x1 y1 x2 y2 x3 y3) 
                  (monte-carlo (- n 1) w x1 y1 x2 y2 x3 y3 xmin dx ymin dy (+ k 1))
                  (monte-carlo (- n 1) w x1 y1 x2 y2 x3 y3 xmin dx ymin dy k)))))
                  
                  
(defun task-r (x1 y1 x2 y2 x3 y3 &optional (n 1000))
 (let* ((s (square-3 x1 y1 x2 y2 x3 y3))
        (xmin (min x1 x2 x3))
        (xmax (max x1 x2 x3))
        (ymin (min y1 y2 y3))
        (ymax (max y1 y2 y3))
        (dx (- xmax xmin))
        (dy (- ymax ymin)) 
        (srec (* dy dx))
        (r 0)
        (w (gensym 'w)))
     (grwCreate w 300 300 "Monte-Carlo" _WHITE)
     (grwSetParm w 3 1 _BLUE _BLUE)
     (grwShow w)
     (grwScale w -100 100 -100 100)
     (grwLine w x1 y1 x2 y2 _RED)
     (grwLine w x2 y2 x3 y3 _RED)
     (grwLine w x3 y3 x1 y1 _RED)
     (setq r  (* dx dy (rat2flo (/ (monte-carlo n w x1 y1 x2 y2 x3 y3 xmin dx ymin dy 0) n))))
     (grwLine w x1 y1 x2 y2 _RED)
     (grwLine w x2 y2 x3 y3 _RED)
     (grwLine w x3 y3 x1 y1 _RED) r))

Объяснение кода листинга программы

  1. Написана функция monte-carlo, которая реализует метод Монте-Карло для вычисления площади треугольника.
  2. В функции используется рекурсия для вычисления площади треугольника.
  3. При достижении условия zerop n рекурсия завершается.
  4. Создается случайная точка внутри треугольника с координатами rx и ry.
  5. Проверяется принадлежит ли случайная точка треугольнику.
  6. Если точка принадлежит треугольнику, то рекурсивно вызывается функция monte-carlo с уменьшенным на единицу числом n и другими параметрами.
  7. Если точка не принадлежит треугольнику, то выполняется рекурсивный вызов функции monte-carlo с исходными значениями n, w, x1, y1, x2, y2, x3, y3, xmin, dx, ymin, dy и k с добавлением единицы к последнему значению k.
  8. Написана функция task-r, которая реализует вычисление площади треугольника с помощью метода Монте-Карло.
  9. В функции создается графический объект w с размерами 300x300 пикселей.
  10. Графический объект w отображается на экране.
  11. Графический объект w масштабируется с коэффициентами -100, -100, 100, 100.
  12. На графическом объекте w рисуются три стороны треугольника с помощью функции grwLine.
  13. Вычисляется площадь треугольника с помощью рекурсивного вызова функции monte-carlo и сохраняется в переменную r.
  14. На графическом объекте w рисуются три стороны треугольника с помощью функции grwLine.
  15. Завершается выполнение функции task-r с возвратом значения площади треугольника r.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5