Найти площадь треугольника методом Монте-Карло (рекурсии) - 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))
Объяснение кода листинга программы
- Написана функция
monte-carlo
, которая реализует метод Монте-Карло для вычисления площади треугольника. - В функции используется рекурсия для вычисления площади треугольника.
- При достижении условия
zerop n
рекурсия завершается. - Создается случайная точка внутри треугольника с координатами
rx
иry
. - Проверяется принадлежит ли случайная точка треугольнику.
- Если точка принадлежит треугольнику, то рекурсивно вызывается функция
monte-carlo
с уменьшенным на единицу числомn
и другими параметрами. - Если точка не принадлежит треугольнику, то выполняется рекурсивный вызов функции
monte-carlo
с исходными значениямиn
,w
,x1
,y1
,x2
,y2
,x3
,y3
,xmin
,dx
,ymin
,dy
иk
с добавлением единицы к последнему значениюk
. - Написана функция
task-r
, которая реализует вычисление площади треугольника с помощью метода Монте-Карло. - В функции создается графический объект
w
с размерами 300x300 пикселей. - Графический объект
w
отображается на экране. - Графический объект
w
масштабируется с коэффициентами -100, -100, 100, 100. - На графическом объекте
w
рисуются три стороны треугольника с помощью функцииgrwLine
. - Вычисляется площадь треугольника с помощью рекурсивного вызова функции
monte-carlo
и сохраняется в переменнуюr
. - На графическом объекте
w
рисуются три стороны треугольника с помощью функцииgrwLine
. - Завершается выполнение функции
task-r
с возвратом значения площади треугольникаr
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д