File: meteor.l

package info (click to toggle)
euslisp 9.27%2Bdfsg-7
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 55,344 kB
  • sloc: ansic: 41,162; lisp: 3,339; makefile: 256; sh: 208; asm: 138; python: 53
file content (64 lines) | stat: -rw-r--r-- 1,809 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 (defun srand ()
   (let ((r (tan (random 0.79))))
     (setq r (* r r))
     (if (= (random 2) 0) (- r) r)))



(defun meteor1 (n)
  (let ((p (float-vector 0 0)))
    (dotimes (i n)
      (setf (aref p 0) (srand)
	    (aref p 1) (srand))
      (send *viewer* :draw-point-ndc p)
;      (xflush)
))))

(defun meteor2 (n)
  (let ((p (float-vector 0 0)) r ang (p3 (float-vector 1 2 0)))
    (dotimes (i n)
      (setq ang (random 2pi))
      (setq r (abs (srand)))
      (setf (aref p 0) (* r (cos ang))
	    (aref p 1) (* r (sin ang)))
      (setq r (random 1.000))
      (cond ((> r 0.990)
		(send *viewer* :draw-star-ndc p))
	    ((< r 0.02)
		(send *viewer* :draw-fill-arc-ndc p r r
			 0.0 2pi))
	    (t        (send *viewer* :draw-point-ndc p)))
;      (xflush)
))))

(defun reflection-ray (normal light)
     (normalize-vector
	(v-  (scale (* 2.0 (v. normal light)) normal)
		light) )) 

(defun random-direction (dir ratio)
  (v+ dir (random-vector ratio)))

(defun dod (dod n &optional (speed 30.0))
 (let ((bx (make-bounding-box (list #f(-500 -500 -500) #f(500 500 500))))
	(dir (float-vector 0 1 0)) p ix ref)
   (send *viewsurface* :function 6)
   (send *viewing* :look-body (send bx :body))
   (hidd (send bx :body))
   (dotimes (i n)
      (draw dod)
      (setq dir  (random-direction  dir 0.1))
      (send dod :translate (scale speed dir) :world)
      (send dod :rotate (random 0.1) dir)
      (draw dod)
      (unless (send bx :inner (setq p  (send dod :worldpos)))
	 (setq ix (maxindex p))
	 (setq ref (elt #(#f(1 0 0) #f(0 1 0) #f(0 0 1)) ix))
	 (setq ref (copy-seq ref))
	 (if (> (aref p ix) 0) (scale -1.0 ref ref))
	 (setq dir (reflection-ray ref (scale -1.0 dir)))]
	(x:bell x:disp)
	 (draw dod)
	 (send dod :translate (scale speed dir) :world)
	 (draw dod))
      (unix:usleep 10000))))