chinese_dense/
chinese_dense.rs

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    // 核心超大词,权重分布更均匀,突出重点词汇,同时避免权重集中
59    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        // 在85~100之间随机,增加大词的字体差异感
73        words.push(WordInput::new(*w, rng.random_range(85.0..=100.0)));
74    }
75
76    // 重要相关概念,权重调整为55~80,增强视觉层次感
77    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    // 常用基础词汇,分三轮加入,权重均匀分布40~55,避免视觉“拥挤”
104    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    // 填充词汇,丰富词云细节,权重范围调整为20~35,减少过密感
142    let fillers = vec![
143        "代码", "逻辑", "数据", "接口", "实现", "调用", "返回", "参数", "类型", "变量", "常量",
144        "静态", "动态", "链接", "库", "包", "依赖", "版本", "发布", "构建", "优化", "调试", "日志",
145        "监控", "设计", "架构", "模式", "算法", "结构", "效率", "速度", "稳定", "扩展", "维护",
146        "重构", "迁移", "学习", "曲线", "入门", "精通",
147    ];
148    for _ in 0..8 {
149        // 略减少次数,控制填充词数量避免拥挤
150        for w in &fillers {
151            words.push(WordInput::new(*w, rng.random_range(20.0..=35.0)));
152        }
153    }
154
155    words
156}