Code: Select all
(taylor-chart:with-pie-chart ("test.png" 256)
(add-slice 25)
(add-slice 50)
(add-slice 75)
(add-slice 100))
Code: Select all
(defpackage :taylor-chart
(:use :common-lisp :vecto)
(:export :with-pie-chart))
(in-package :taylor-chart)
(defmacro with-pie-chart ((file radius) &rest body)
`(let ((slice-pieces nil)
(slice-spacing 0))
(flet ((add-slice (value &optional caption color)
(setf slice-pieces (cons value slice-pieces))))
(with-canvas (:width ,radius :height ,radius)
,@body
(format t "~a~%" slice-pieces)
(translate (/ ,radius 2) (/ ,radius 2))
(setf slice-pieces (nreverse slice-pieces))
(let ((idx 0) (sum (reduce #'+ slice-pieces))
(len (length slice-pieces)))
(reduce (lambda (x y)
(let ((z (* (/ y sum) 2 pi)))
(incf idx)
(format t "Drawing arc: ~a ~a~%" x (+ x z))
(set-rgb-fill (/ idx len) (/ idx len) (/ idx len))
(move-to 0 0)
(arc 0 0 128 x (+ x z))
(fill-and-stroke)
(+ x z))) slice-pieces :initial-value 0)
(save-png ,file))))))
Code: Select all
(LET ((TAYLOR-CHART::SLICE-PIECES NIL) (TAYLOR-CHART::SLICE-SPACING 0))
(FLET ((TAYLOR-CHART::ADD-SLICE
(TAYLOR-CHART::VALUE
&OPTIONAL TAYLOR-CHART::CAPTION TAYLOR-CHART::COLOR)
(SETF TAYLOR-CHART::SLICE-PIECES
(CONS TAYLOR-CHART::VALUE TAYLOR-CHART::SLICE-PIECES))))
(VECTO:WITH-CANVAS (:WIDTH 256 :HEIGHT 256) (ADD-SLICE 25) (ADD-SLICE 50)
(ADD-SLICE 75) (ADD-SLICE 100)
(FORMAT T "~a~%" TAYLOR-CHART::SLICE-PIECES)
(VECTO:TRANSLATE (/ 256 2) (/ 256 2))
(SETF TAYLOR-CHART::SLICE-PIECES
(NREVERSE TAYLOR-CHART::SLICE-PIECES))
(LET ((TAYLOR-CHART::IDX 0)
(TAYLOR-CHART::SUM
(REDUCE #'+ TAYLOR-CHART::SLICE-PIECES))
(TAYLOR-CHART::LEN
(LENGTH TAYLOR-CHART::SLICE-PIECES)))
(REDUCE
(LAMBDA (TAYLOR-CHART::X TAYLOR-CHART::Y)
(LET ((TAYLOR-CHART::Z
(* (/ TAYLOR-CHART::Y TAYLOR-CHART::SUM) 2
PI)))
(INCF TAYLOR-CHART::IDX)
(FORMAT T "Drawing arc: ~a ~a~%" TAYLOR-CHART::X
(+ TAYLOR-CHART::X TAYLOR-CHART::Z))
(VECTO:SET-RGB-FILL
(/ TAYLOR-CHART::IDX TAYLOR-CHART::LEN)
(/ TAYLOR-CHART::IDX TAYLOR-CHART::LEN)
(/ TAYLOR-CHART::IDX TAYLOR-CHART::LEN))
(VECTO:MOVE-TO 0 0)
(VECTO:ARC 0 0 128 TAYLOR-CHART::X
(+ TAYLOR-CHART::X TAYLOR-CHART::Z))
(VECTO:FILL-AND-STROKE)
(+ TAYLOR-CHART::X TAYLOR-CHART::Z)))
TAYLOR-CHART::SLICE-PIECES :INITIAL-VALUE 0)
(VECTO:SAVE-PNG "test.png")))))
Thanks for any hints or ideas.