分形程式高階技巧入門教程 第九到十二章

2021-05-24 08:03:27 字數 2374 閱讀 1898

分形程式高階技巧入門教程--第九到十二章

迭代逃逸時的復數值也可以作為顏色函式的引數,比如:

其中,把"迭代值"的距離值帶入了顏色函式中,產生的如下:

(當然x和y值也可以作為顏色引數,甚至於整個迭代過程中產生的值都是不錯的顏色引數!)

由於迭代次數的不同,造成生成的顏色產生了較強的階梯;要去掉該階梯我們可以進行乙個簡單的插值,

前面對迭代逃逸次數進行了插值(結果為iter),那麼正好就可以用該值來對迭代值進行線性插值!

插值係數: s=iter-(long)iter; //得到0--1之間的乙個值,用來表示兩次迭代值之間的權重

插值方程: sx=x(i)*s+x(i-1)*(1-s);

sy=y(i)*s+y(i-1)*(1-s);

這樣得到的結果就是連續的了,**如下:

生成的如下:

十.迭代生成的復數值的高階插值

前面得到的顏色結果雖然連續,但看起來還是不夠平滑;這是因為兩次迭代值之間的關係可能並不是線性的關係;

我們可能很難去推導出迭代值的實際關係,但我們可以用通用的高次插值曲線來近似的擬合它,

比如我們使用常用的3次卷積來試試:

插值係數: s=iter-(long)iter;

插值方程: sx=x(i)*sinxdivx(2-s)+x(i-1)*sinxdivx(1-s)+x(i-2)*sinxdivx(s)+x(i-3)*sinxdivx(1+s);

sy=y(i)*sinxdivx(2-s)+y(i-1)*sinxdivx(1-s)+y(i-2)*sinxdivx(s)+y(i-3)*sinxdivx(1+s);

其中sinxdivx為:          

(a+2)*x^3 - (a+3)*x^2 +1       (0<=x<1)

h(x)=  a*x^3 - 5*a*x^2 + 8*a*x - 4*a  (1<=x<2)

0                              (2<=x)

(其中a一般取-0.5..-1)

**如下:

生成的如下:

(可以試試卷積核中取不同a的效果)

在資料插值中,b樣條插值(b-spline)也是乙個非常常用的插值演算法,b樣條插值的插值核:

x^3/2 - x^2 + 2/3               (0<=x<1)

h(x) = (2-x)^3/6                       (1<=x<2)

0                               (2<=x)

**如下:

生成的如下:

(這裡的插值結果看起來比3次卷積的效果好些)

我把顏色函式稍微修改了一下,**如下:

生成的如下:

重點:迭代過程中生成的資料都可以作為顏色函式的引數(color=f(iter,i,x,y,等);)!

更廣義的迭代值插值函式為:

z=g(s,t(z[k]),t(z[k-1]),...,t(z[k-(n-1)]));

這裡g代表插值核,s代表插值係數,t代表變換函式,z代表迭代值陣列,k代表起始陣列座標(比如k=i-1),

n代表使用迭代值的個數;

請試試,不同的k和各種t函式的效果!

十一.圖形的放大和旋轉

我們前面定義的tviewrect;結構已經能很好的支援縮放了,調節r的大小

就是放大或縮小,x0和y0代表的是縮放的中心點; 要支援旋轉,我們增加乙個成員,

角度seta(單位為度):

座標點(x,y)的旋轉方程為:

rsin=sin(viewrect.seta*(pi/180));

rcos=cos(viewrect.seta*(pi/180));

new_x= (x-viewrect.x0)*rcos + (y-viewrect.y0)*rsin + viewrect.x0;

new_y=-(x-viewrect.x0)*rsin + (y-viewrect.y0)*rcos + viewrect.y0;

複數初始值在迭代前經過該旋轉變換,就達到了旋轉的目的,**如下:

測試縮放和旋轉的**如下:

生成的如下:

(放大m集的乙個小區域)

(旋轉45度)

十二.複數初始值的變換

複數初始值在迭代前可以經過旋轉變換,當然也可以在該階段經過更多的變換函式,

比如tan變換:

生成的如下:

複數倒數作為變換函式會怎樣呢?

生成的如下:

(1/c面)

我們甚至也可以把其他分形演算法合併進來,比如用julia迭代作為變換函式:

測試**:

生成的如下:

mysql分庫分表入門教程

1 資料庫瓶頸 1 io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io,降低查詢速度 分庫 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 2 cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...

OpenCV Python入門教程5 閾值分割

灰度圖讀入 閾值分割 ret,th cv2.threshold img,127,255,cv2.thresh binary cv2.imshow thresh th cv2.waitkey 0 cv2.threshold 用來實現閾值分割,有4個引數 理解這5種閾值方式 應用5種不同的閾值方法 re...

《Flask 入門教程》第 3 章 模板

在一般的 web 程式裡,訪問乙個位址通常會返回乙個包含各類資訊的 html 頁面。因為我們的程式是動態的,頁面中的某些資訊需要根據不同的情況來進行調整,比如對登入和未登入使用者顯示不同的資訊,所以頁面需要在使用者訪問時根據程式邏輯動態生成。我們把包含變數和運算邏輯的 html 或其他格式的文字叫做...