The curve diamondjim created is right. If you want it more accurate, just set the variant "pnts" bigger.
There are several involute equations, his is right.
Here below I attached a lisp file which creates involute curve only, it can also create "short" or "long" involute, that means: the curve is not generated from the point on generate line, but some point offset from the line. So the curve generated from inside of base circle, when you set "h" negetive. By this, gear root fillet can be exactly drawn.
;
(defun c:involute ()
(command "_undo" "be")
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(setq q 0)
(setq f 0)
(setq h (getreal "\nDistance Offset:"))
(setq r (getreal "\nRadius of Practical Circle:"))
(setq t (getreal "\nAngle to go:"))
(setq n (getreal "\nAccurancy:")) ;set it in a degital smaller the 1
(setq cent (getpoint "\nCenter of Curve:"))
(if (= h 0) (command "pline" (list (+ (/ r 1) (car cent)) (cadr cent))
(list (+ (/ r 2) (car cent)) (cadr cent)) ""
)
(command "pline" (setq trimpoint (list (+ h r (car cent)) ((if (> h 0) - +) (cadr cent) (/ r 1))))
(list (+ h r (car cent)) ((if (> h 0) - +) (cadr cent) (/ r 2))) ""
)
)
(while (< f (* t (/ pi 180)))
(setq a (atan (* r f) (+ r h)))
(setq ri (/ (+ r h) (cos a)))
(setq q (- f a))
(setq pt0 (polar cent q ri))
(command "pline" "" pt0 "")
(setq f (+ f n))
)
(command "pedit" (entlast) "j" "all" "" "f" "")
(command "circle" cent r)
(setq bs (entlast))
(command "line" cent (list (+ 1 r h (car cent)) (cadr cent)) "")
(setq lt (entlast))
(if (= h 0) (command "trim" bs "" cent "")
(command "trim" lt "" trimpoint "")
)
(command "erase" lt "")
(setvar "osmode" os)
(command "_undo" "e")
(princ)
)