lunes, 28 de noviembre de 2011

Juego del Caos 3D

;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