1use araea_wordcloud::{ColorScheme, WordCloudBuilder, WordInput};
2use rand::Rng;
3use std::fs;
4use std::time::Instant;
5
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 let mut words = generate_dense_chinese_data();
8 println!("Generated {} Chinese words.", words.len());
9
10 let start = Instant::now();
11
12 let width = 1600;
13 let height = 1100;
14
15 println!("Building word cloud ({}x{})...", width, height);
16
17 let count_len = words.len();
18 let dynamic_max_font_size = if count_len < 20 {
19 150.0
20 } else if count_len < 50 {
21 120.0
22 } else {
23 100.0
24 };
25
26 let max_weight = words.first().map(|w| w.weight).unwrap_or(100.0);
27 for word in &mut words {
28 if max_weight > 100.0 {
29 word.weight = word.weight.sqrt() * 10.0;
30 }
31 }
32
33 let scheme = ColorScheme::Default;
34 let wordcloud = WordCloudBuilder::new()
35 .size(width, height)
36 .color_scheme(scheme)
37 .background(scheme.background_color())
38 .padding(2)
39 .angles(vec![0.0, 90.0])
40 .word_spacing(2.0)
41 .font_size_range(14.0, dynamic_max_font_size)
42 .seed(2025)
43 .build(&words)?;
44
45 let output_path = "output_chinese_dense.png";
46 fs::write(output_path, wordcloud.to_png(2.0)?)?;
47
48 println!("Success! Time elapsed: {:?}", start.elapsed());
49 println!("Saved to {}", output_path);
50
51 Ok(())
52}
53
54fn generate_dense_chinese_data() -> Vec<WordInput> {
55 let mut words = Vec::new();
56 let mut rng = rand::rng();
57
58 let core_keywords = vec![
60 "Rust编程",
61 "高性能",
62 "内存安全",
63 "WebAssembly",
64 "系统级",
65 "无GC",
66 "所有权",
67 "生命周期",
68 "借用检查",
69 "并发模型",
70 ];
71 for w in &core_keywords {
72 words.push(WordInput::new(*w, rng.random_range(85.0..=100.0)));
74 }
75
76 let concepts = vec![
78 "Cargo",
79 "Crates.io",
80 "Tokio",
81 "Actix",
82 "Serde",
83 "Diesel",
84 "Async/Await",
85 "Trait",
86 "Struct",
87 "Enum",
88 "Pattern Matching",
89 "Zero-cost",
90 "安全性",
91 "跨平台",
92 "嵌入式",
93 "网络服务",
94 "命令行工具",
95 "错误处理",
96 "Result",
97 "Option",
98 ];
99 for w in &concepts {
100 words.push(WordInput::new(*w, rng.random_range(55.0..=80.0)));
101 }
102
103 let common = vec![
105 "编译",
106 "运行",
107 "测试",
108 "文档",
109 "模块",
110 "函数",
111 "闭包",
112 "迭代器",
113 "集合",
114 "字符串",
115 "指针",
116 "引用",
117 "智能指针",
118 "Box",
119 "Rc",
120 "Arc",
121 "Mutex",
122 "Channel",
123 "Future",
124 "Stream",
125 "宏定义",
126 "属性",
127 "泛型",
128 "Community",
129 "Foundation",
130 "Docs",
131 "Book",
132 "Examples",
133 "Tutorial",
134 ];
135 for _ in 0..3 {
136 for w in &common {
137 words.push(WordInput::new(*w, rng.random_range(40.0..=55.0)));
138 }
139 }
140
141 let fillers = vec![
143 "代码", "逻辑", "数据", "接口", "实现", "调用", "返回", "参数", "类型", "变量", "常量",
144 "静态", "动态", "链接", "库", "包", "依赖", "版本", "发布", "构建", "优化", "调试", "日志",
145 "监控", "设计", "架构", "模式", "算法", "结构", "效率", "速度", "稳定", "扩展", "维护",
146 "重构", "迁移", "学习", "曲线", "入门", "精通",
147 ];
148 for _ in 0..8 {
149 for w in &fillers {
151 words.push(WordInput::new(*w, rng.random_range(20.0..=35.0)));
152 }
153 }
154
155 words
156}