;Autor: José Manuel Gómez Soto
#lang racket
(require plot)
(define longitud (lambda(lista)
(if (null? lista) 0
(+ 1 (longitud (rest lista))))))
(define mimap (lambda(f lista)
(if (null? lista) '()
(cons (f (car lista))
(mimap f (cdr lista))))))
(define sumapuntos3d (lambda (p1 p2)
(list (+ (car p1) (car p2)) (+ (car (cdr p1)) (car (cdr p2)))
(+ (car (cdr (cdr p1))) (car (cdr (cdr p2))) ) )))
(define dividepunto3d (lambda (p1 divisor)
(list (/ (car p1) divisor) (/ (car (cdr p1)) divisor)
(/ (car (cdr (cdr p1))) divisor))))
(define orbitapuntos (lambda(f p1 n)
(if (= n 0) '()
(cons p1 (orbitapuntos f (f p1) (- n 1))))))
(define juegocaos (lambda(figura npuntos divisor)
(orbitapuntos (lambda(p)
(dividepunto3d
(sumapuntos3d p
(elemento (random (longitud figura)) figura)) divisor))
(list (* (random 10) 0.1) (* (random 10) 0.1) (* (random 10) 0.1))
npuntos)))
(define elemento (lambda(pos lista)
(if (= pos 0) (car lista)
(elemento (- pos 1) (rest lista))
)
))
(define figura (list (list 0 0 0) (list 10 0 0) (list 5 10 0) (list 8 10 8)))
(plot3d (points3d (map list->vector (juegocaos figura 100000 2)) #:sym 'dot)
#:x-min 0 #:x-max 10 #:y-min 0 #:y-max 10 #:z-min 0 #:z-max 10)
No hay comentarios:
Publicar un comentario