本帖最后由 highflybird 于 2014-8-22 15:05 编辑
程序的LISP代码:
- ;;;*********************************************
- ;;; 迭代公式(用户可以自行修改)
- ;;; x,xx复数的实数部分,y,yy复数的虚数部分
- ;;; xx = (x-x/(x*x+y*y))/2+cx
- ;;; yy = (y+y/(x*x+y*y))/2+cy
- ;;;*********************************************
- (defun fx (x y cx cy)
- (if (and (zerop x) (zerop y))
- cx
- (+ (* 0.5 (- x (/ x (+ (* x x) (* y y))))) cx)
- )
- )
- (defun fy (x y cx cy)
- (if (and (zerop x) (zerop y))
- cy
- (+ (* 0.5 (+ y (/ y (+ (* x x) (* y y))))) cy)
- )
- )
- ;;;*********************************************
- ;;; 逃逸判断:
- ;;; 当两个复数相接近的时候停止迭代
- ;;;*********************************************
- (defun Escape (x xx y yy tol)
- (< (+ (* (- xx x) (- xx x)) (* (- yy y) (- yy y))) tol)
- )
-
- ;;;*********************************************
- ;;; Highflybird分形的绘制主函数
- ;;; 参数: col0 初始颜色值
- ;;; X1,X2,Y1,Y2,点的取值范围
- ;;; W,H 图像的宽和高
- ;;; tol 逃逸半径
- ;;; Itr 迭代最大次数
- ;;; Grad 颜色梯度
- ;;;*********************************************
- (defun HFB_fractal (col0 X1 X2 Y1 Y2 W H tol Itr grad /
- i j dx dy HSL0 cx cy x y n xx yy)
- (setq HSL0 (apply 'RGB->HSL col0))
- (setq dx (/ (- X2 X1 0.0) W))
- (setq dy (/ (- Y2 Y1 0.0) H))
- (setq i 0)
- (repeat W ;图像的宽
- (setq j 0)
- (repeat H ;图像的高
- (setq cx (+ X1 (* i dx))) ;实数部分
- (setq cy (+ Y1 (* j dy))) ;虚数部分
- (setq x cx y cy) ;开始迭代位置
- (setq n 0) ;迭代次数置零
- (while (<= n Itr) ;开始迭代
- (setq xx (fx x y cx cy)) ;得到新的实数部分
- (setq yy (fy x y cx cy)) ;得到新的虚数部分
- (if (Escape xx x yy y tol) ;如果满足逃逸函数
- (progn
- (PutColor HSL0 i j n grad) ;着色这点
- (setq n Itr) ;中断循环
- )
- (setq x xx y yy) ;否则继续迭代
- )
- (setq n (1+ n))
- )
- (setq j (1+ j))
- )
- (setq i (1+ i))
- )
- )
当然用LISP速度比较慢,最后我用了ARX编程,才满足了所见即所得的效果。
顺便推销一下我的博客地址:http://highflybird.mjtd.com/
欢迎大家有空转转哦!
|