图形与渲染
Sounio 在此仓库快照中目前有两个真实的图形系列:
examples/graphics/ 下的终端原生科学显示和 examples/render/ 下的软件光栅化图像输出。
下面的光栅预览是从检查过的 JIT 工件的精确 stdout 生成的,然后作为网站的 SVG 资产提交。
此页面现在包含五个真实的光栅预览,而不是两个孤立的样本。
真实光栅输出
此示例是一个真正的巴里中心光栅化器。公共页面图片是由编译器输出生成的,而不是手工绘制的草图。
Source: examples/render/triangle_basic.sio
bin/souc run examples/render/triangle_basic.sio > triangle_basic.ppm (从上一节继续)
此示例展示了一个旋转立方体,按深度着色边缘,并直接从Sounio代码输出可移植的PPM帧。
Source: examples/render/cube_wireframe.sio
bin/souc run examples/render/cube_wireframe.sio > cube_wireframe.ppm 这个预览将类型导向的不确定性转化为一个真实的认识论领域:值沿x轴运行,epsilon沿y轴运行,亮度随着不确定性的增加而降低。
Source: examples/render/uncertainty_field.sio
bin/souc run examples/render/uncertainty_field.sio > uncertainty_field.ppm (继续自前一节)
这个渲染直接将前门风格的图表编码为像素,包括do(X)-风格的干预着色和一个明确的潜在混杂因素。
Source: examples/render/causal_dag.sio
bin/souc run examples/render/causal_dag.sio > causal_dag.ppm (继续上节)
该场景使用四元数数学旋转四面体,将两个姿态投影到屏幕空间,并在原始和旋转顶点之间叠加对应线。
Source: examples/render/quaternion_rotation.sio
bin/souc run examples/render/quaternion_rotation.sio > quaternion_rotation.ppm 为什么选择这个图形栈?
- 真实的编译器输出:上面的栅格部分是从检查过的
souc run输出中生成的,而不是屏幕截图 - 可移植的输出格式:终端演示使用 Unicode/ANSI;栅格演示输出纯 PPM
- 无窗口依赖:当前示例不需要 X11、OpenGL 或 GUI 工具包
- SSH 友好:终端和文件渲染都可以在远程系统上工作
终端画廊
八维数乘法表
皇冠上的宝石——一个完全彩色化的8D代数可视化,其中Fano平面结构通过颜色模式立即显现。
╔══════════════════════════════════════════════════════════════════════════╗ ║ 八元数乘法表 - 彩色版 ║ ╚══════════════════════════════════════════════════════════════════════════╝ × │ 1 i j k l il jl kl ────┼──────────────────────────────────────────────── 1 │ 1 i j k l il jl kl i │ i -1 k -j il -l -kl jl j │ j -k -1 i jl kl -l -il k │ k j -i -1 kl -jl il -l l │ l -il -jl -kl -1 i j k il │ il l -kl jl -i -1 -k j jl │ jl kl l -il -j k -1 -i kl │ kl -jl il l -k -j i -1 图例:1=实数 ijk=四元数 liljlkl=八元数 dim=负数
/>
fMRI Brain Activation热图
使用Unicode块字符的32×32脑切片可视化,采用渐变强度。
╔═══════════════════════════════════════════════════╗ ║ fMRI 大脑激活 - 切片 z=32 ║ ╚═══════════════════════════════════════════════════╝
(继续上节)
前方 ░░░░░░░░░░░░░░░░░░░ ░░░░░░▒▒▒▒▒▒▒▒░░░░░░░░ ░░░░▒▒████████▒▒░░░░ ░░░▒▒██████████████▒▒░░░ ░░░▒▒███████████████████▒▒░░░ L ░░▒▒███████░░░░███████▒▒░░ R ░░▒▒███████░░░░░░███████▒▒░░ ░░▒▒████████░░████████▒▒░░ ░░░▒▒███████████████▒▒░░░ ░░░░▒▒▒███████▒▒▒░░░░ ░░░░░░▒▒▒▒▒▒▒▒░░░░░░░░ ░░░░░░░░░░░░░░░░░░░ 后方
<span class="c-dim">强度:</span>░=0.0 <span class="c-yellow">▒</span>=0.3 <span class="c-red">█</span>=0.6 <span class="c-white">█</span>=1.0
<span class="c-dim">区域:</span><span class="c-red">视觉</span> <span class="c-green">运动</span> <span class="c-cyan">额叶</span>
---
### 3D线框立方体
旋转立方体,采用等距投影和轴指示器。
<TerminalOutput
client:load
title="phase3_showcase.sio - 旋转立方体"
html={`<span class="c-bold c-cyan">╔═══════════════════════════════════════════════════╗</span>
<span class="c-bold c-cyan">║</span> <span class="c-bold c-yellow">3D WIREFRAME CUBE</span> - <span class="c-cyan">Frame 42</span> <span class="c-bold c-cyan">║</span>
<span class="c-bold c-cyan">╚═══════════════════════════════════════════════════╝</span>`}
/>
(续前)
<span class="c-green">Y</span>
<span class="c-green">│</span>
<span class="c-white">┌───────────┐</span>
<span class="c-white">╱│</span> <span class="c-white">╱│</span>
<span class="c-white">╱</span> <span class="c-white">│</span> <span class="c-white">╱</span> <span class="c-white">│</span>
<span class="c-white">╱</span> <span class="c-white">│</span> <span class="c-white">╱</span> <span class="c-white">│</span>
<span class="c-white">┌───────────┐</span> <span class="c-white">│</span>
<span class="c-white">│</span> <span class="c-white">│</span> <span class="c-white">│</span> <span class="c-white">│</span>
<span class="c-white">│</span> <span class="c-white">└───────│───┘</span>
<span class="c-white">│</span> <span class="c-white">╱</span> <span class="c-white">│</span> <span class="c-white">╱</span>
<span class="c-white">│</span> <span class="c-white">╱</span> <span class="c-white">│</span> <span class="c-white">╱</span>
<span class="c-white">│╱</span> <span class="c-white">│╱</span>
<span class="c-white">└───────────┘</span>──────<span class="c-red">X</span>
<span class="c-white">╱</span>
<span class="c-blue">Z</span>
(续自上一节)
<span class="c-dim">投影:等距投影(30°)</span>
<span class="c-dim">轴:</span><span class="c-red">X</span>=红色 <span class="c-green">Y</span>=绿色 <span class="c-blue">Z</span>=蓝色`}
/>
---
### 粒子系统动画
基于物理的粒子喷泉,包含重力和阻力。
<TerminalOutput
client:load
title="phase5_showcase.sio - 粒子喷泉"
html={`<span class="c-bold c-cyan">╔═══════════════════════════════════════════════════╗</span>
<span class="c-bold c-cyan">║</span> <span class="c-bold c-yellow">粒子喷泉</span> - <span class="c-cyan">帧120</span> <span class="c-bold c-cyan">║</span>
<span class="c-bold c-cyan">╚═══════════════════════════════════════════════════╝</span>`}
/>
<span class="c-yellow">★</span>
<span class="c-yellow">★</span> <span class="c-yellow">★</span>
<span class="c-cyan">·</span> <span class="c-cyan">·</span>
<span class="c-green">·</span> <span class="c-yellow">★</span> <span class="c-yellow">★</span> <span class="c-green">·</span>
<span class="c-cyan">·</span> <span class="c-cyan">·</span>
<span class="c-white">○</span> <span class="c-green">·</span> <span class="c-green">·</span> <span class="c-white">○</span>
<span class="c-cyan">·</span> <span class="c-cyan">·</span>
<span class="c-magenta">○</span> <span class="c-white">○</span> <span class="c-white">○</span> <span class="c-magenta">○</span>
<span class="c-red">·</span> <span class="c-yellow">│</span> <span class="c-red">·</span>
<span class="c-dim">·</span> <span class="c-yellow">│</span> <span class="c-dim">·</span>
<span class="c-dim">·</span> <span class="c-yellow">│</span> <span class="c-dim">·</span>
════════════════════<span class="c-blue">█</span>════════════════════
(续前)
<span class="c-dim">粒子:847 活跃</span>
<span class="c-dim">物理:重力=0.1,阻力=0.99,风=0.02</span>
<span class="c-dim">寿命:</span><span class="c-yellow">★</span>=新 <span class="c-green">·</span>=中 <span class="c-dim">·</span>=旧`}
/>
---
### 流体力学 (纳维-斯托克斯方程)
基于 Jos Stam 的 "稳定流体" 算法进行烟雾模拟。
<TerminalOutput
client:load
title="phase5_showcase.sio - 流体力学"
html={`<span class="c-bold c-cyan">╔═══════════════════════════════════════════════════╗</span>
<span class="c-bold c-cyan">║</span> <span class="c-bold c-yellow">流体力学</span> - <span class="c-cyan">烟雾上升</span> <span class="c-bold c-cyan">║</span>
<span class="c-bold c-cyan">╚═══════════════════════════════════════════════════╝</span>`}
/>
(继续上节)
<span class="c-dim">░░</span><span class="c-white">░░</span><span class="c-dim">░░</span>
<span class="c-dim">░░</span><span class="c-white">░░▒▒</span><span class="c-dim">░░░░</span>
<span class="c-dim">░░</span><span class="c-white">▒▒▓▓▒▒</span><span class="c-dim">░░░░</span>
<span class="c-dim">░░░</span><span class="c-white">▒▒██▓▓▒▒</span><span class="c-dim">░░░░</span>
<span class="c-dim">░░░░</span><span class="c-white">▒▒▓▓██▓▓▒▒</span><span class="c-dim">░░░░░</span>
<span class="c-dim">░░</span><span class="c-white">▒▒▓▓███▓▓▒▒</span><span class="c-dim">░░</span>
<span class="c-dim">░░</span><span class="c-white">▒▒███▒▒</span><span class="c-dim">░░</span>
<span class="c-white">▒▒███▒▒</span>
<span class="c-white">▓▓██▓▓</span>
<span class="c-white">████</span>
<span class="c-yellow">████</span>
<span class="c-red">▓▓▓▓</span>
<span class="c-red">░</span><span class="c-yellow">██</span><span class="c-red">░</span>
<span class="c-yellow">▀▀</span>
═══════════════════════════════════════════
<span class="c-dim">算法:稳定流体(Stam 1999)</span>
<span class="c-dim">网格:64×64,粘滞性=0.0001</span>`}
/>
---
### 分叉图
洛吉斯蒂克映射显示倍周期分叉到混沌的过程。
<TerminalOutput
client:load
title="phase6_showcase.sio - 分叉"
html={`<span class="c-bold c-cyan">╔═══════════════════════════════════════════════════╗</span>
<span class="c-bold c-cyan">║</span> <span class="c-bold c-yellow">LOGISTIC MAP BIFURCATION</span> - <span class="c-cyan">周期倍增</span> <span class="c-bold c-cyan">║</span>
<span class="c-bold c-cyan">╚═══════════════════════════════════════════════════╝</span>
x<span class="c-dim">↑</span>
1│ <span class="c-cyan">░░░░░░░░░░░░</span>
│ <span class="c-cyan">░░</span><span class="c-magenta">▒▒▒▒▒▒▒▒</span><span class="c-cyan">░░</span>
│ <span class="c-cyan">░░</span><span class="c-magenta">▒▒</span><span class="c-white">████████</span><span class="c-magenta">▒▒</span>
│ <span class="c-green">▒▒</span><span class="c-magenta">▒▒</span><span class="c-white">████████</span><span class="c-magenta">▒▒</span><span class="c-cyan">░</span>
│ <span class="c-green">▒▒▒▒</span> <span class="c-white">████████</span>
│ <span class="c-yellow">▒▒▒▒</span> <span class="c-white">████████</span>
│ <span class="c-yellow">▒▒▒▒</span> <span class="c-white">█</span> <span class="c-white">█</span>
│ <span class="c-yellow">░░░</span> <span class="c-white">█</span> <span class="c-white">█</span>
│ <span class="c-yellow">░░░░</span>
│ <span class="c-yellow">░░░░</span>
│ <span class="c-yellow">░░░░</span>
0│<span class="c-yellow">░░░░░</span>
└──────────────────────────────────────────────→r
2.5 3.0 3.5 4.0
(继续上节内容)
<span class="c-dim">x_{n+1} = r × x_n × (1 - x_n)</span>
<span class="c-dim">显示:</span><span class="c-yellow">固定点</span> → <span class="c-green">周期-2</span> → <span class="c-magenta">周期-4</span> → <span class="c-cyan">混沌</span>`}
/>
/>
---
### 力导向图布局
使用 Fruchterman-Reingold 算法进行社交网络可视化。
<TerminalOutput
client:load
title="phase7_showcase.sio - 网络图"
html={`<span class="c-bold c-cyan">╔═══════════════════════════════════════════════════╗</span>
<span class="c-bold c-cyan">║</span> <span class="c-bold c-yellow">力导向图</span> - <span class="c-cyan">社交网络</span> <span class="c-bold c-cyan">║</span>
<span class="c-bold c-cyan">╚═══════════════════════════════════════════════════╝</span>
<span class="c-cyan">(Bob)</span>─────────<span class="c-green">(Eve)</span>
│╲ ╱│
│ ╲ ╱ │
│ ╲ ╱ │
│ ╲ ╱ │
│ ╲ ╱ │
│ ╲ ╱ │
│ ╲ ╱ │
<span class="c-red">(Alice)</span>──<span class="c-yellow">(Carol)</span>
│ ╱ ╲ │
│ ╱ ╲ │
│ ╱ ╲ │
│ ╱ ╲ │
│ ╱ ╲ │
│ ╱ ╲ │
│╱ ╲│
<span class="c-magenta">(Dave)</span>─────────<span class="c-white">(Frank)</span>
<span class="c-dim">节点:6 边:12</span>
<span class="c-dim">算法:Fruchterman-Reingold</span>
<span class="c-dim">温度:0.05(收敛)</span>`}
/>
---
### Kalman滤波不确定性
带有颜色编码置信度的顺序贝叶斯信念更新。
<TerminalOutput
client:load
title="10_kalman_filter_color.sio"
html={`<span class="c-bold c-cyan">╔═══════════════════════════════════════════════════╗</span>
<span class="c-bold c-cyan">║</span> <span class="c-bold c-yellow">卡尔曼滤波器</span> - <span class="c-cyan">传感器融合</span> <span class="c-bold c-cyan">║</span>
<span class="c-bold c-cyan">╚═══════════════════════════════════════════════════╝</span>
<span class="c-bold">通过传感器融合减少不确定性:</span>
(续前)
在σ=10.0m之前:
<span class="c-red">██████████████████████████████████████</span> <span class="c-red">高</span>
在GPS之后(σ=4.5m):
<span class="c-yellow">███████████████</span> <span class="c-yellow">中</span>
在IMU之后(σ=0.5m):
<span class="c-green">██</span> <span class="c-green">低</span>
在激光雷达之后(σ=0.1m):
<span class="c-green">▏</span> <span class="c-green">非常低</span>
<span class="c-bold">精确增长(1/σ²):</span>
<span class="c-cyan">先验: </span><span class="c-cyan">▏</span>
<span class="c-cyan">+GPS: </span><span class="c-cyan">█</span>
<span class="c-cyan">+IMU: </span><span class="c-cyan">████████</span>
<span class="c-cyan">+激光雷达: </span><span class="c-cyan">████████████████████████████████</span>
<span class="c-dim">总不确定性降低:99%</span>
<span class="c-dim">精确度增长:10,405×</span>`}
/>
<TerminalOutput
client:load
title="08_climate_ensemble_color.sio"
html={`<span class="c-bold c-cyan">╔═══════════════════════════════════════════════════╗</span>
<span class="c-bold c-cyan">║</span> <span class="c-bold c-yellow">CMIP6 CLIMATE PROJECTIONS</span> - <span class="c-cyan">SSP2-4.5</span> <span class="c-bold c-cyan">║</span>
<span class="c-bold c-cyan">╚═══════════════════════════════════════════════════╝</span>
<span class="c-bold">全球平均温度变化(2100年与1850-1900年相比):</span>
GFDL-ESM4: <span class="c-red">█████████████████</span>│ 1.8°C ± 0.2
HadGEM3: <span class="c-green">█████████████████████</span>│ 2.1°C ± 0.3
MIROC6: <span class="c-yellow">███████████████████</span>│ 1.9°C ± 0.25
IPSL-CM6A: <span class="c-magenta">███████████████████████</span>│ 2.3°C ± 0.4
MPI-ESM: <span class="c-cyan">████████████████████</span>│ 2.0°C ± 0.1
├─────────────────────────────────┤
0 1.5°C 3.0°C
(继续上节)
<span class="c-bold">集合均值:</span>
<span class="c-red">██</span><span class="c-green">██</span><span class="c-yellow">██</span><span class="c-magenta">██</span><span class="c-cyan">██</span><span class="c-red">██</span><span class="c-green">██</span><span class="c-yellow">██</span><span class="c-magenta">██</span><span class="c-cyan">██</span>│ <span class="c-bold">2.02°C ± 0.18</span>
<span class="c-yellow">⚠ 巴黎1.5°C目标:有12%的概率保持在以下</span>
<span class="c-yellow">⚠ 巴黎2.0°C目标:有47%的概率保持在以下</span>`}
/>
---
## 运行示例
```bash
SOUC_BIN=bin/souc
# 光栅渲染(PPM输出到标准输出)
"$SOUC_BIN" run examples/render/triangle_basic.sio > triangle_basic.ppm
"$SOUC_BIN" run examples/render/cube_wireframe.sio > cube_wireframe.ppm
# 科学可视化
"$SOUC_BIN" run examples/visual/06_octonion_color_table.sio
"$SOUC_BIN" run examples/visual/10_kalman_filter_color.sio
"$SOUC_BIN" run examples/visual/12_animated_diffusion.sio
(继续从上一次部分)
图形库演示
“$SOUC_BIN” run examples/graphics/demos/phase3_showcase.sio # 3D “$SOUC_BIN” run examples/graphics/demos/phase5_showcase.sio # 动画 “$SOUC_BIN” run examples/graphics/demos/phase7_showcase.sio # 网络
从精确编译器输出刷新网站栅格预览
npm —prefix website run generate:render-assets
## 库结构
# 库结构
| 阶段 | 模块 | 能力 |
|-------|---------|--------------|
| **第1阶段** | `canvas`, `colors`, `drawing`, `text` | 核心图形元素,ANSI颜色,形状 |
| **第2阶段** | `axes`, `scatter`, `line_plot`, `bar_chart`, `histogram`, `heatmap` | 2D绘图 |
| **第3阶段** | `projection`, `wireframe`, `scatter3d` | 3D可视化 |
| **第4阶段** | `input`, `interactive_plot` | 缩放,平移,鼠标/键盘 |
| **第5阶段** | `animation`, `particle_system`, `fluid_sim` | 动画,物理 |
| **第6阶段** | `phase_diagram`, `bifurcation`, `poincare`, `streamlines` | 科学图表 |
| **第7阶段** | `graph`, `force_directed`, `tree_layout`, `graph_render` | 网络可视化 |
---
## 开始使用
```bash
# 运行一个阶段展示
bin/souc run examples/graphics/demos/phase1_showcase.sio