Science Workflow

Graphics and Rendering

Terminal-native scientific visuals plus real raster renders generated by the checked JIT artifact.

Back to Science Hub

图形与渲染

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
一个16x16的热图,不确定性单元从冷暗的方块到亮暖的方块。
不确定性领域

这个预览将类型导向的不确定性转化为一个真实的认识论领域:值沿x轴运行,epsilon沿y轴运行,亮度随着不确定性的增加而降低。

Source: examples/render/uncertainty_field.sio

bin/souc run examples/render/uncertainty_field.sio > uncertainty_field.ppm

(继续自前一节)

一个带有红色干预节点X,蓝色观察节点M和Y,以及由箭头连接的灰色潜在节点U的因果图。
因果DAG

这个渲染直接将前门风格的图表编码为像素,包括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平面结构通过颜色模式立即显现。

06_octonion_color_table.sio
╔══════════════════════════════════════════════════════════════════════════╗
           八元数乘法表 - 彩色版              
╚══════════════════════════════════════════════════════════════════════════╝


    ×  1    i    j    k    l   il   jl   kl
  ────┼────────────────────────────────────────────────
 11    i    j    k    l   il   jl   kl
 ii   -1    k   -j   il   -l  -kl   jl
 jj   -k   -1    i   jl   kl   -l  -il
 kk    j   -i   -1   kl  -jl   il   -l
 ll  -il  -jl  -kl  -1    i    j    k
ilil    l  -kl   jl  -i   -1   -k    j
jljl   kl    l  -il  -j    k   -1   -i
klkl  -jl   il    l  -k   -j    i   -1


图例:1=实数  ijk=四元数  liljlkl=八元数  dim=负数

/>


fMRI Brain Activation热图

使用Unicode块字符的32×32脑切片可视化,采用渐变强度。

02_fmri_octonion_activation.sio
╔═══════════════════════════════════════════════════╗
     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