Draw a sphere: Difference between revisions

Content added Content deleted
(→‎Fun with 3D noise texture: removed the reference to the undeclared ddd variable. It would not be used at all.)
(Added naive translation from Java)
Line 1,181: Line 1,181:
(mouseFunc '((Btn State X Y) (bye)))
(mouseFunc '((Btn State X Y) (bye)))
(glutMainLoop)</lang>
(glutMainLoop)</lang>

{{trans|Java}}

<lang PicoLisp>(scl 24)

(setq *Shades
(list "." ":" "!" "*" "o" "e" "&" "#" "%" "@"))

(setq *Light
(list 30.0 30.0 -50.0))

(de normalize (V)
(let Len
(sqrt
(sum
(quote (X)
(** X 2))
V))
(mapcar
(quote (X)
(*/ X 1.0 Len))
V)))

(de dot (X Y)
(let D (sum (quote (A B) (*/ A B 1.0)) X Y)
(if (< D 0) (- D) 0)))

(de floor (N)
(* 1.0 (*/ (- N 0.5) 1.0)))

(de ceil (N)
(* 1.0 (*/ (+ N 0.5) 1.0)))

(de drawSphere (R K Ambient)
(let Vec NIL
(for (I (floor (- R)) (<= I (ceil R)) (+ I 1.0))
(let X (+ I 0.5)
(for (J (floor (* -2 R)) (<= J (ceil (* 2 R))) (+ J 1.0))
(let Y (+ (/ J 2) 0.5)
(if (<= (+ (*/ X X 1.0) (*/ Y Y 1.0)) (*/ R R 1.0))
(prog
(setq Vec
(list X Y
(sqrt
(* 1.0
(- (*/ R R 1.0)
(*/ X X 1.0)
(*/ Y Y 1.0))))))
(setq Vec (normalize Vec))
(let (B NIL
Intensity NIL)
(setq B (+ (/ (** (dot *Light Vec) K) (** 1.0 (- K 1))) Ambient))
#(println (format (/ (** (dot *Light Vec) K) (** 1.0 (- K 1))) *Scl))
(setq Intensity
(if (<= B 0)
(- (length *Shades) 2)
(max (format (round (*/ (- 1.0 B) (* (- (length *Shades) 1) 1.0) 1.0) 0)) 0)))
(prin (nth *Shades (+ Intensity 1) 1))))
(prin " "))))
(prinl)))))

(setq *Light (normalize *Light))
(drawSphere 20.0 4 0.1)
(drawSphere 10.0 2 0.4)</lang>


=={{header|PostScript}}==
=={{header|PostScript}}==