第二十章 非同步和檔案I O (二十)

2021-09-19 18:17:48 字數 2782 閱讀 2931

乙個mvvm mandelbrot

xamarin.forms - 以這種方式為畫素著色。該程式還允許放大特定位置。這是mandelbrot集的乙個特徵,無論你放大多遠,影象仍然很有趣。不幸的是,基於doubleprecision浮點數的解析度,縮放存在實際限制。

該程式使用mvvm原理進行架構,雖然在看到有些奇怪的使用者介面以及viewmodel如何處理該使用者介面後,您可能會質疑該決策的智慧型。

mandelbrotxf的奇怪使用者介面源於決定避免任何特定於平台的**。在最初編寫此程式時,xamarin.forms不支援拖動和捏合等觸控操作,這些操作可能有助於放大到特定位置。相反,程式的整個使用者介面使用兩個slider元素,兩個stepper元素,兩個button元素,乙個progessbar和使用boxview實現的視覺效果來實現。

當您第一次執行該程式時,您將看到以下內容:

白色十字準線 - 沒有出現在空白的ios和windows 10移動螢幕的白色背景 - 在10秒的時間內淡出,這樣它們就不會模糊你很快就會欣賞的漂亮**, 但你可以通過操縱滑塊或步進器來將它們帶回來。

但是你要做的第一件事就是按下go按鈕。 該按鈕被取消按鈕替換,progressbar指示進度。 當它完成後,你會看到乙個彩色的mandelbrot集:

它完成得很快,因為最大迭代次數(由底部步進器標記的迴圈表示)僅為2到第三次冪,或8.因此,黑色mandelbrot集的輪廓不像早期程式那樣尖銳。 與更高的最大迭代計數相比,更多的點被標記為集合的成員。 您可以將迭代計數增加2的冪。這是乙個更清晰的影象,最大迭代次數為64:

兩個滑塊檢視允許您選擇乙個新的中心,該中心在滑塊正下方顯示為複數。 第乙個步進元素(標記為縮放)允許您選擇放大係數,也是2的冪。當您操縱這三個元素時,您將看到乙個帶十字準線的方框

由六個薄boxview元素構成。 該框標記下次按「執行」按鈕時將放大的區域:

現在再次按下go按鈕並等待。 現在,以前裝箱的區域填充了點陣圖:

計算新影象後,十字準線將被重新定位,您可以重新定位中心並再次放大,然後再次放大。

但是,通常放大的越多,檢視所有細節所需的最大迭代次數就越多。 對於每個裝置,前面螢幕截圖中的影象可以獲得四倍於迭代的明顯更多細節:

這是mandelbrot套裝的乙個特點,你可以隨心所欲地放大,你仍然可以看到同樣多的細節。 但是,通常你需要不斷增加最大迭代次數,當你達到放大係數2到48次左右時,你已經達到了涉及雙精度浮動解析度的上限 點數。 相鄰畫素不再與不同的複數相關聯,並且影象開始看起來像塊狀:

這不是超越的容易障礙。 存在可變精度浮點數的實現,但由於它們不是由計算機的數學協處理器直接處理,涉及這些數字的計算必然比浮點數或雙精度型別慢得多,並且您可能不希望mandelbrot計算慢一點。

mandelbrotxf程式同時具有viewmodel和底層模型。 模型執行實際數字運算並返回bitmapinfo型別的物件,該物件指示畫素寬度和高度以及整數陣列。 整數陣列的大小是畫素寬度和高度的乘積,陣列的元素是迭代計數。 值-1表示mandelbrot集的成員:

namespace mandelbrotxf

public int pixelwidth

public int pixelheight

public int iterationcounts }}

mandelbrotmodel類包含單個非同步方法。 除了iprogress物件之外,所有引數都是值型別,因此在計算進行過程中不存在任何引數更改的危險:

namespace mandelbrotxf

// else if (c.magnitudesquared * (8 * c.magnitudesquared - 3) <

3.0 / 32 - c.real)

else

while (iteration < iterations && z.magnitudesquared < 4);

if (iteration == iterations)

else}}

}return new bitmapinfo(pixelwidth, pixelheight, iterationcounts);

}, canceltoken);}}

}

此calculateasync方法僅從viewmodel呼叫。 viewmodel還旨在為xaml檔案提供資料繫結源,並幫助**隱藏檔案執行xaml資料繫結無法處理的那些作業。 (繪製十字準線和放大框是該**隱藏檔案的工作。)

第二十章 非同步和檔案I O (二十)

乙個mvvm mandelbrot xamarin.forms 以這種方式為畫素著色。該程式還允許放大特定位置。這是mandelbrot集的乙個特徵,無論你放大多遠,影象仍然很有趣。不幸的是,基於doubleprecision浮點數的解析度,縮放存在實際限制。該程式使用mvvm原理進行架構,雖然在看...

第二十章 非同步和檔案I O (十六)

await task.run 雖然您可以將task.run本身與其他 一起使用,但通常它用於構造非同步方法。按照慣例,非同步方法的字尾為async。該方法返回task物件 如果方法不返回任何值或物件 或task 物件 如果它確實返回了某些東西 以下是如何建立乙個返回task的非同步方法 task m...

第二十章 Skeletal Animation

skeletal animation 骨骼動畫 是指互相連線的變換 骨頭 組成的分層集合,以及對應的模型mesh 即骨骼的 當這些變換隨著時間變化而變化時,模型的mesh就會形成動畫效果。本章,我們將會 skeketal animation,並開發一些系統用於支援模型動畫。把乙個skeleton對映...