使用Rust和并發實現一個高性能的彩色分形圖案渲染

分形與 Mandelbrot

Mandelbrot 集 (Mandelbrot Set) 是復數平面上一個點的集合,以數學家 Beno?t Mandelbrot 的名字命名。它是最著名的分形之一。一個復數 c 是否屬于 Mandelbrot 集,取決于一個簡單的迭代過程:
z n + 1 = z n 2 + c z_{n+1}=z_{n}^2+c zn+1?=zn2?+c

如果這個序列 z0?,z1?,z2?,… 的大小(模)保持在一定范圍內(具體來說,不超過 2),那么我們就說復數 c 屬于 Mandelbrot 集。如果序列的大小趨向于無窮大,那么 c 就不屬于這個集合。

當我們為復數平面上的每個點 c 運行這個迭代過程,并根據它“逃逸”到無窮大的速度(或者它是否保持有界)給它上色時,我們就會得到 Mandelbrot 集那標志性的、無限復雜的圖像。

那些“逃逸”得慢的點或者不逃逸的點,通常被涂成黑色,而那些“逃逸”得快的點,則根據它們的逃逸速度被賦予不同的顏色,從而形成了圖像中絢麗多彩的部分。

項目準備

創建一個 Rust 項目:

cargo new mandelbrot

程序需要以下依賴:

[dependencies]
clap = { version = "4.x", features = ["derive"] }
image = "0.25.1"
num = "0.4.3"

計算 Mandelbrot 迭代

計算相對而言是比較簡單的,我們需要引入 Rust 的一個數值類型庫 num,從而支持復數類型。

如果對復數不熟悉,也沒關系,就把實部想象成笛卡爾坐標系的 x 軸(橫向),虛部想象成 y 軸(只不過以 i 為單位)。

use num::Complex;fn escape_time(c: Complex<f64>, limit: usize) -> Option<usize> {let mut z = Complex { re: 0.0, im: 0.0 };for i in 0..limit {if z.norm_sqr() > 4.0 {return Some(i);}z = z * z + c;}None
}

程序上非常簡單,就是持續迭代計算 z * z + c,如果 limit 次迭代里它沒有越界,我們就認為它屬于 Mandelbrot 集合。如果超過了,就返回迭代的次數(即逃逸時間);如果在達到上限之前都沒有超過,就返回 None,表示我們認為這個點可能屬于 Mandelbrot 集。

像素到點的映射

我們需要一種方法來將圖像中的每個像素(如 (25, 175))映射到復數平面上的一個點(如 -0.5 - 0.75i)。

fn pixel_to_point(bounds: (usize, usize),    // 圖像尺寸 (寬, 高)pixel: (usize, usize),     // 像素坐標 (列, 行)upper_left: Complex<f64>,  // 左上角對應的復數lower_right: Complex<f64>, // 右下角對應的復數
) -> Complex<f64> {let (width, height) = (lower_right.re - upper_left.re, // 復數平面的寬度upper_left.im - lower_right.im, // 復數平面的高度);Complex {re: upper_left.re + pixel.0 as f64 * width / bounds.0 as f64,im: upper_left.im - pixel.1 as f64 * height / bounds.1 as f64,}
}

由于數學上的坐標系和計算機通常的屏幕坐標系的 y 軸方向是相反。計算機圖像通常左上角是 (0, 0),y 軸向下增長,復平面通常 y 軸(虛部)向上增長。因此,在計算虛部 im 時,我們是從 upper_left.im 減去

渲染圖片

要繪制 Mandelbrot 集,只需要將 escape_time 用在復平面上的點,根據逃逸時間賦以不同的灰度值。

fn render(pixels: &mut [u8],bounds: (usize, usize),upper_left: Complex<f64>,lower_right: Complex<f64>,
) {assert!(pixels.len() == bounds.0 * bounds.1);for row in 0..bounds.1 {for column in 0..bounds.0 {let point = pixel_to_point(bounds, (column, row), upper_left, lower_right);pixels[row * bounds.0 + column] = match escape_time(point, 255) {None => 0, // 屬于 Mandelbrot 集,設為黑色 (0)Some(count) => 255 - count as u8, // 不屬于,顏色與逃逸時間相關}}}
}

如果沒有逃逸,則是黑色 0,否則就根據逃逸時間賦值 255 - count

到這里,我們就完成了核心的程序。下面的部分屬于渲染和保存。

寫入圖片

use std::fs::File;
use image::{ExtendedColorType, ImageEncoder

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85058.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85058.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85058.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序的軟件測試用例編寫指南及示例--性能測試用例

以下是針對微信小程序的性能測試用例補充,結合代碼邏輯和實際使用場景,從加載性能、渲染性能、資源占用、交互流暢度等維度設計測試點,并標注對應的優化方向: 一、加載性能測試用例 測試項測試工具/方法測試步驟預期結果優化方向冷啟動加載耗時微信開發者工具「性能」面板…

行為型:觀察者模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 實現案例 3、優缺點分析 4、適用場景 5、注意事項 1、核心思想 目的&#xff1a;針對被觀察對象與觀察者對象之間一對多的依賴關系建立起一種行為自動觸發機制&#xff0c;當被觀察對象狀態發生變化時主動對外發起廣播&…

t009-線上代駕管理系統

項目演示地址 摘 要 使用舊方法對線上代駕管理系統的信息進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在線上代駕管理系統的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題…

LVS-NAT 負載均衡群集

目錄 簡介 一、LVS 與群集技術基礎 1.1 群集技術概述 1.2 負載均衡群集的分層結構 1.3 負載均衡工作模式 二、LVS 虛擬服務器核心組件與配置 2.1 LVS 內核模塊與管理工具 2.2 負載調度算法解析 2.3 ipvsadm 管理工具實戰 三、NFS 共享存儲服務配置 3.1 NFS 服務基礎…

LLaMaFactory - 支持的模型和模板 常用命令

一、 環境準備 激活LLaMaFactory環境&#xff0c;進入LLaMaFactory目錄 cd LLaMA-Factoryconda activate llamafactory 下載模型 #模型下載 from modelscope import snapshot_download model_dir snapshot_download(Qwen/Qwen2.5-0.5B-Instruct) 二、啟動一個 Qwen3-0.6B…

EDW2025|數據治理的神話破除——從誤區到現實

在當今數據驅動的世界中&#xff0c;數據治理已成為企業成功的關鍵因素。然而&#xff0c;許多組織在實施數據治理時&#xff0c;常常被一些常見的誤區所困擾。本文將逐一破除這些誤區&#xff0c;揭示數據治理的真實面貌。 誤區一&#xff1a;你需要一個大的預算&#xff01;…

AIGC與影視制作:技術革命、產業重構與未來圖景

文章目錄 一、AIGC技術全景&#xff1a;從算法突破到產業賦能1. **技術底座&#xff1a;多模態大模型的進化路徑**2. **核心算法&#xff1a;從生成對抗網絡到擴散模型的迭代** 二、AIGC在影視制作全流程中的深度應用1. **劇本創作&#xff1a;從“靈感枯竭”到“創意井噴”**2…

ReactJS 中的 JSX工作原理

文章目錄 前言? 1. JSX 是什么&#xff1f;&#x1f527; 2. 編譯后的樣子&#xff08;核心機制&#xff09;&#x1f9f1; 3. React.createElement 做了什么&#xff1f;&#x1f9e0; 4. JSX 與組件的關系&#x1f504; 5. JSX 到真實 DOM 的過程&#x1f4d8; 6. JSX 與 Fr…

Spring Advisor增強規則實現原理介紹

Spring Advisor增強規則實現原理介紹 一、什么是 Advisor&#xff1f;1. Advisor 的定義與本質接口定義&#xff1a; 2. Advisor 的核心作用統一封裝切點與通知構建攔截器鏈的基礎實現增強邏輯的靈活組合 二. Sprin當中的實現邏輯1 Advisor 接口定義2 PointcutAdvisor 接口定義…

小程序32-簡易雙向數據綁定

在WXML中&#xff0c;普通屬性的綁定是單向的&#xff0c;例如:<input value"{{value}}" /> 如果希望用戶輸入數據的同時改變data中的數據&#xff0c;可以借助簡易雙向綁定機制。在對應屬性之前添加model:前綴即可: 例如<input model:value"{{value}…

Nginx網站服務:從入門到LNMP架構實戰

&#x1f3e1;作者主頁&#xff1a;點擊&#xff01; Nginx-從零開始的服務器之旅專欄&#xff1a;點擊&#xff01; &#x1f427;Linux高級管理防護和群集專欄&#xff1a;點擊&#xff01; ??創作時間&#xff1a;2025年5月30日14點22分 前言 說起Web服務器&#xff0c…

【maker-pdf 文檔文字識別(包含ocr),安裝使用完整教程】

安裝環境 conda create -n maker-pdf python3.12 conda activate marker-pdf pip install modelscope pip install marker-pdf -U下載模型 from modelscope import snapshot_downloadmodel_root "models" snapshot_download("Lixiang/marker-pdf", loca…

C# 類和繼承(所有類都派生自object類)

所有類都派生自object類 除了特殊的類object&#xff0c;所有的類都是派生類&#xff0c;即使它們沒有基類規格說明。類object是唯 一的非派生類&#xff0c;因為它是繼承層次結構的基礎。 沒有基類規格說明的類隱式地直接派生自類object。不加基類規格說明只是指定object為 基…

尚硅谷redis7 90-92 redis集群分片之集群擴容

90 redis集群分片之集群擴容 三主三從不夠用了&#xff0c;進行擴容變為4主4從 問題&#xff1a;1.新建兩個redis實例&#xff0c;怎么加入原有集群&#xff1f;2.原有的槽位分3段&#xff0c;又加進來一個槽位怎么算&#xff1f; 新建6387、6388兩個服務實例配置文件新建后啟…

尚硅谷-尚庭公寓部署文檔

文章目錄 整合版部署文檔部署架構圖1. 項目目錄結構增加注釋的 Dockerfile 配置(1) 后端服務1 Dockerfile (backend/service1/Dockerfile)(2) 后端服務2 Dockerfile (backend/service2/Dockerfile) Dockerfile 配置說明重要注意事項3. Nginx 配置(1) 主配置文件 (nginx/nginx.c…

Android Studio 介紹

如何關閉或徹底刪除一個工程 基于Android Studio的android入門——如何關閉或徹底刪除一個工程 搜索內容 Android Studio高效指南&#xff1a;快速查找技巧大揭秘 build命令&#xff1a;gradle app:assembleDebug 命令解析 1. 命令結構與作用 核心功能&#xff1a;該命令…

JAVA與C語言之間的差異(一)

一、代碼習慣以及主函數 JAVA中{在使用的時候不要換行 public static void main(String[] args) {int[] array {1, 2, 3};for(int i 0; i < array.length; i){System.out.println(array[i] " ");}} 其次&#xff0c;以main函數為主函數&#xff1a; public …

華為OD機試真題——開放日活動/取出盡量少的球(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《開放…

我的3種AI寫作節奏搭配模型,適合不同類型寫作者

—不用內耗地高效寫完一篇內容&#xff0c;原來可以這樣搭配AI ?? 開場&#xff1a;為什么要“搭配節奏”寫作&#xff1f; 很多人以為用AI寫作&#xff0c;就是丟一句提示詞&#xff0c;然后“等它寫完”。 但你有沒有遇到這些情況&#xff1a; AI寫得很快&#xff0c;學境…

【知識點】第1章:程序設計基本方法

文章目錄 知識點整理計算機的概念程序設計語言Python 語言概述Python 語言開發環境配置程序的基本編寫方法 練習題簡答題判斷題 知識點整理 計算機的概念 計算機的定義&#xff1a;計算機是根據指令操作數據的設備。 計算機的兩個基本特性&#xff1a; 功能性&#xff1a;計…