分形程式高階技巧入門教程--第九到十二章
迭代逃逸時的復數值也可以作為顏色函式的引數,比如:
其中,把"迭代值"的距離值帶入了顏色函式中,產生的如下:
(當然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 或其他格式的文字叫做...