From: James A. <amu...@us...> - 2005-01-18 03:30:44
|
Update of /cvsroot/maxima/maxima/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1129 Modified Files: plot.lisp Log Message: Implemented discrete option for 2d plots. Fixed bugs in multiple parametric plots and added proper labels for parametric plots. discrete plotting examples: xx:makelist(x,x,0,10); yy:makelist(exp(-x*1.0),x,0,10); xy:makelist([x,exp(-x*1.0)],x,0,10); /* plot with line segments */ plot2d([discrete,xx,yy]); /* plot with points */ plot2d([discrete,xx,yy],[gnuplot_curve_styles,["with points"]]); /* plot the curve cos(x) using lines and (xx,yy) using points */ plot2d([cos(x),[discrete,xx,yy]],[x,0,10],[gnuplot_curve_styles,["with lines","with points pointsize 3"]]); /*plot2d([parametric,sin(t),cos(t),[t,0,10],[nticks,80]],[gnuplot_curve_styles,["with lines linewidth 3"]]); plot2d([[parametric,sin(t),cos(t),[t,0,10],[nticks,80]],[parametric,sin(2*t),cos(t),[t,0,10],[nticks,80]]]);*/ plot2d([discrete,xy]); Index: plot.lisp =================================================================== RCS file: /cvsroot/maxima/maxima/src/plot.lisp,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- plot.lisp 18 Nov 2004 15:20:28 -0000 1.45 +++ plot.lisp 18 Jan 2005 03:30:33 -0000 1.46 @@ -706,6 +706,25 @@ ))) ) +(defun draw2d-discrete (f) + (let ((x (third f)) + (y (fourth f))) + (cond + ((= (length f) 4) ; [discrete,x,y] + (if (not ($listp x)) + (merror "draw2d (discrete): ~M must be a list." x)) + (if (not ($listp y)) + (merror "draw2d (discrete): ~M must be a list." y)) + (cons '(mlist) (mapcan #'list (rest x) (rest y)))) + ((= (length f) 3) ; [discrete,xy] + (if (not ($listp x)) + (merror "draw2d (discrete): ~M must be a list." x)) + (let ((tmp (mapcar #'rest (rest x)))) + (cons '(mlist) (mapcan #'append tmp)))) + (t ; error + (merror + "draw2d (discrete): expression is not of the form [discrete,x,y] or ~%[discrete,xy]."))))) + ;; arrange so that the list of points x0,y0,x1,y1,.. on the curve ;; never have abs(y1-y0 ) and (x1-x0) <= deltax @@ -852,6 +871,8 @@ (defun draw2d (f range) (if (and ($listp f) (equal '$parametric (cadr f))) (return-from draw2d (draw2d-parametric f range))) + (if (and ($listp f) (equal '$discrete (cadr f))) + (return-from draw2d (draw2d-discrete f))) (let* ((nticks (nth 2 ($get_plot_option '$nticks))) (yrange ($get_plot_option '|$y|)) (depth (nth 2 ($get_plot_option '$adapt_depth))) @@ -1074,6 +1095,8 @@ (cond ((and (consp fun) (eq (cadr fun) '$parametric)) (or range (setq range (nth 4 fun))) (setf fun `((mlist) ,fun)))) + (cond ((and (consp fun) (eq (cadr fun) '$discrete)) + (setf fun `((mlist) ,fun)))) (cond ((eq ($get_plot_option '$plot_format 2) '$ps) (return-from $plot2d (apply '$plot2d_ps fun range options)))) (cond ((eq ($get_plot_option '$plot_format 2) '$openmath) @@ -1082,8 +1105,17 @@ ;; this has to come after the checks for ps and openmath ;; (see bug report #834729) (or ($listp fun ) (setf fun `((mlist) ,fun))) - - (check-range range) + (let ((no-range-required t)) + (if (not ($listp fun)) + (setf no-range-required nil) + (dolist (subfun (rest fun)) + (if (not ($listp subfun)) + (setf no-range-required nil)))) + (unless no-range-required + (check-range range)) + (if (and no-range-required range) + ;;; second argument was really a plot option, not a range + ($set_plot_option range))) (setf plot-format ($get_plot_option '$plot_format 2)) (setf gnuplot-term ($get_plot_option '$gnuplot_term 2)) (if ($get_plot_option '$gnuplot_out_file 2) @@ -1102,9 +1134,19 @@ (dolist (v (cdr fun)) (incf i) (setq plot-name - (let ((string (coerce (mstring v) 'string))) - (cond ((< (length string) 20) string) - (t (format nil "Fun~a" i))))) + (let ((string "")) + (cond ((atom v) + (setf string (coerce (mstring v) 'string))) + ((eq (second v) '$parametric) + (setf string + (concatenate + 'string (coerce (mstring (third v)) 'string) + ", " (coerce (mstring (fourth v)) 'string)))) + ((eq (second v) '$discrete) + (setf string (format nil "discrete~a" i))) + (t (setf string (coerce (mstring v) 'string)))) + (cond ((< (length string) 80) string) + (t (format nil "fun~a" i))))) (case plot-format ($gnuplot (if (> i 1) @@ -1134,18 +1176,18 @@ (format st "~%~%# \"~a\"~%" plot-name)) ) (loop for (v w) on (cdr (draw2d v range )) by #'cddr - do - (cond ((eq v 'moveto) - (cond - ((equal plot-format '$gnuplot) - ;; A blank line means a discontinuity - (format st "~%")) - ((equal plot-format '$mgnuplot) - ;; A blank line means a discontinuity - (format st "~%")) - (t - (format st "move ")))) - (t (format st "~g ~g ~%" v w)))))) + do + (cond ((eq v 'moveto) + (cond + ((equal plot-format '$gnuplot) + ;; A blank line means a discontinuity + (format st "~%")) + ((equal plot-format '$mgnuplot) + ;; A blank line means a discontinuity + (format st "~%")) + (t + (format st "move ")))) + (t (format st "~g ~g ~%" v w)))))) (case plot-format ($gnuplot (gnuplot-process file)) @@ -1690,9 +1732,13 @@ (symbolp (car tem)) (numberp (setq a (meval* (second tem)))) (numberp (setq b (meval* (third tem)))) - (< a b) - ) - (merror "Bad Range ~%~M must be of the form [variable,min,max]" range)) + (< a b)) + (if range + (merror + "Bad range: ~M.~%Range must be of the form [variable,min,max]" + range) + (merror + "No range given. Must supply range of the form [variable,min,max]"))) `((mlist) ,(car tem) ,(float a) ,(float b))) (defun $zero_fun (x y) x y 0.0) |