;******************************************************************************************* ;* Breather Pseudosphere, by Paul Nylander, bugman123.com, 3/11/09 ;******************************************************************************************* ;Basic Functions (defun ² (x) (* x x)) (defun sinh (x) (* 0.5 (- (exp x) (exp (- x))))) (defun cosh (x) (* 0.5 (+ (exp x) (exp (- x))))) ;Converts Polygon into AutoCAD's Triangle Elements, only works for convex polygons ;(TriangulateElem '(1 2 3 4 5 6 7 8 9 10)) -> '((1 2 -3) (-1 3 -4) (-1 4 -5) (-1 5 -6) (-1 6 -7) (-1 7 -8) (-1 8 -9) (-1 9 10)) (defun TriangulateElem (elem / n i i0 i1 i2 elems) (setq n (length elem)) (if (= n 3) (list elem) (progn (setq i0 (car elem) i1 (caddr elem) elems (list (list i0 (cadr elem) (- i1))) i 3) (while (< i (1- n)) (setq i2 (nth i elem) elems (append elems (list (list (- i0) i1 (- i2)))) i1 i2 i (1+ i))) (append elems (list (list (- i0) i1 (last elem)))) ));i );d (defun mesh (nodes elems1 / elems2 nnode nelem elem) (setq elems2 (apply 'append (mapcar 'TriangulateElem elems1))); introduces AutoCAD's negative index notation (setq nnode (length nodes) nelem (length elems2)) (entmake (list '(0 . "POLYLINE") '(70 . 64) (cons 71 nnode) (cons 72 nelem))) (foreach p nodes (entmake (list '(0 . "VERTEX") (cons 10 p) '(70 . 192)))) (foreach elem elems2 (entmake (list '(0 . "VERTEX") '(10 0.0 0.0 0.0) '(70 . 128) (cons 71 (car elem)) (cons 72 (cadr elem)) (cons 73 (caddr elem)) (cons 74 (- (abs (car elem)))) )));f (entmake '((0 . "SEQEND"))) );d (defun ParametricPlot3D (f u1 u2 du v1 v2 dv / u v i j i1 i2 i3 i4 imax jmax nodes elems) (setq imax (fix (+ (/ (- u2 u1) du) 0.5)) jmax (fix (+ (/ (- v2 v1) dv) 0.5))) (setq j 0); calculate nodes (while (<= j jmax) (setq v (+ v1 (* j dv)) i 0) (while (<= i imax) (setq u (+ u1 (* i du)) nodes (append nodes (list (f u v))) i (1+ i))) (setq j (1+ j)) );w (setq i 1); assemble quad elements (while (<= i imax) (setq j 0) (while (< j jmax) (setq i1 (+ i (* j (1+ imax))) i2 (1+ i1) i3 (+ i1 (1+ imax) 1) i4 (+ i1 (1+ imax)) elems (append elems (list (list i1 i2 i3 i4))) j (1+ j) ));w (setq i (1+ i)) );w (mesh nodes elems) );d ;Breather Pseudosphere (setq a 0.4988876515657235 w (sqrt (- 1.0 (² a))) umax 10.0 vmax 47.12315917347652) (defun Breather (u v / sinvw cosvw b r x y z) (setq sinvw (sin (* v w)) cosvw (cos (* v w)) b (* w (cosh (* a u)))) (setq r (/ (* 2 b) (* a (+ (² b) (² (* a sinvw)))))) (setq x (* r -1 (+ (* (sin v) sinvw) (* w (cos v) cosvw)))) (setq y (* r (- (* (cos v) sinvw) (* w (sin v) cosvw)))) (setq z (- (* r w (sinh (* a u))) u)) (list x y z) );d (ParametricPlot3D Breather (- umax) umax (/ umax 24) 0.0 vmax (/ vmax 76)) (command "vpoint" (list -1.0 -1.0 1.0)); (command "zoom" "extents")