分享图
动画工坊
引擎就绪
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>双传感器差分比较法动画</title>
    <style>
        html, body {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
            background-color: #050810;
            display: flex;
            align-items: center;
            justify-content: center;
            overflow: hidden;
            font-family: 'Consolas', 'Courier New', monospace;
            font-variant-numeric: tabular-nums;
            color: #E2E8F0;
        }
        .container {
            width: 100%;
            max-width: 1400px;
            aspect-ratio: 16 / 9;
            position: relative;
            box-shadow: 0 0 40px rgba(0, 229, 255, 0.05);
        }
        svg {
            width: 100%;
            height: 100%;
            display: block;
        }
        .btn {
            cursor: pointer;
            transition: opacity 0.2s;
        }
        .btn:hover {
            opacity: 0.8;
        }
        .unselectable {
            user-select: none;
            pointer-events: none;
        }
        /* 进气口流动动画 */
        @keyframes flow {
            from { stroke-dashoffset: 10; }
            to { stroke-dashoffset: 0; }
        }
        .flow-line {
            animation: flow 0.5s linear infinite;
        }
    </style>
</head>
<body>
    <div class="container">
        <svg viewBox="0 0 1200 675">
            <!-- 滤镜和定义区 -->
            <defs>
                <filter id="glow-cyan" x="-20%" y="-20%" width="140%" height="140%">
                    <feGaussianBlur stdDeviation="4" result="blur" />
                    <feMerge>
                        <feMergeNode in="blur" />
                        <feMergeNode in="SourceGraphic" />
                    </feMerge>
                </filter>
                <filter id="glow-orange" x="-20%" y="-20%" width="140%" height="140%">
                    <feGaussianBlur stdDeviation="4" result="blur" />
                    <feMerge>
                        <feMergeNode in="blur" />
                        <feMergeNode in="SourceGraphic" />
                    </feMerge>
                </filter>
                <filter id="glow-purple" x="-20%" y="-20%" width="140%" height="140%">
                    <feGaussianBlur stdDeviation="5" result="blur" />
                    <feMerge>
                        <feMergeNode in="blur" />
                        <feMergeNode in="SourceGraphic" />
                    </feMerge>
                </filter>
                <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
                    <path d="M 40 0 L 0 0 0 40" fill="none" stroke="rgba(255,255,255,0.03)" stroke-width="1"/>
                </pattern>
                <linearGradient id="chamber-gradient" x1="0%" y1="0%" x2="0%" y2="100%">
                    <stop offset="0%" stop-color="#00E5FF" stop-opacity="0.6"/>
                    <stop offset="100%" stop-color="#00E5FF" stop-opacity="0.1"/>
                </linearGradient>
            </defs>

            <!-- 背景网格 -->
            <rect width="1200" height="675" fill="#0A0F1D" />
            <rect width="1200" height="675" fill="url(#grid)" />

            <!-- 标题区 -->
            <text x="30" y="45" fill="#FFF" font-size="24" font-weight="bold" letter-spacing="1">双传感器差分比较法诊断系统</text>
            <text x="30" y="75" fill="#A0AEC0" font-size="14">【TRIZ IFR】引入波动的公共场作为共同参考背景,将绝对标定转化为相对一致度比较,彻底消除高精度气源依赖</text>

            <!-- =================左侧:物理系统原理图================= -->
            <g id="physical-system" transform="translate(0, 20)">
                <!-- 进气管道与波动气源提示 -->
                <path d="M180 550 L180 470 L220 470 L220 550 Z" fill="#111827" stroke="#4A5568" stroke-width="2"/>
                <path d="M200 550 L200 480" stroke="#00E5FF" stroke-width="2" stroke-dasharray="5,5" fill="none" class="flow-line"/>
                <text x="200" y="575" fill="#00E5FF" font-size="12" text-anchor="middle">普通气压源 (伴随波动干扰)</text>

                <!-- 双腔分流块与内部气室 -->
                <path d="M100 390 L300 390 L280 470 L120 470 Z" fill="#0F172A" stroke="#4A5568" stroke-width="2"/>
                <path id="gasChamber" d="M110 400 L290 400 L272 460 L128 460 Z" fill="url(#chamber-gradient)" opacity="0.2"/>
                <!-- 关键概念强调 -->
                <text x="200" y="375" fill="#FFD700" font-size="12" text-anchor="middle" font-weight="bold" style="filter:url(#glow-orange)">↑ 共同承受波动的密闭压力场 ↑</text>

                <!-- 传感器 -->
                <!-- 参考传感器 -->
                <rect x="130" y="300" width="30" height="90" fill="#00E5FF" rx="3" opacity="0.9" style="filter:url(#glow-cyan)"/>
                <text x="145" y="350" fill="#000" font-size="12" font-weight="bold" text-anchor="middle" transform="rotate(-90 145,350)">REF</text>
                <text x="145" y="290" fill="#00E5FF" font-size="10" text-anchor="middle">标准参考</text>

                <!-- 过渡接头与被测传感器 -->
                <rect x="235" y="390" width="20" height="10" fill="#CBD5E0" rx="1"/> <!-- 过渡接头 -->
                <text x="310" y="398" fill="#A0AEC0" font-size="10">兼容过渡接头</text>
                <path d="M255 395 L305 395" stroke="#CBD5E0" stroke-width="1" stroke-dasharray="2" fill="none"/>
                
                <rect x="230" y="290" width="30" height="100" fill="#FF9100" rx="3" opacity="0.9" style="filter:url(#glow-orange)"/>
                <text x="245" y="345" fill="#000" font-size="12" font-weight="bold" text-anchor="middle" transform="rotate(-90 245,345)">TEST</text>
                <text x="245" y="280" fill="#FF9100" font-size="10" text-anchor="middle">被测样件</text>

                <!-- 数据线缆 -->
                <path d="M145 300 L145 220 L160 220 L160 170" fill="none" stroke="#00E5FF" stroke-width="2"/>
                <path d="M245 290 L245 220 L230 220 L230 170" fill="none" stroke="#FF9100" stroke-width="2"/>

                <!-- 同步 ADC 模块 -->
                <rect x="100" y="110" width="190" height="60" fill="#111827" stroke="#B388FF" stroke-width="2" rx="6" style="filter:url(#glow-purple)"/>
                <text x="195" y="135" fill="#B388FF" font-size="13" font-weight="bold" text-anchor="middle">双路同步采样 ADC</text>
                <text x="195" y="155" fill="#A0AEC0" font-size="10" text-anchor="middle">同步误差 &lt; 0.1ms / 自动温度补偿</text>
                
                <!-- 连接到图表区的数据流线 -->
                <path d="M290 140 L450 140" fill="none" stroke="#B388FF" stroke-width="2" stroke-dasharray="6,4">
                    <animate attributeName="stroke-dashoffset" from="20" to="0" dur="0.5s" repeatCount="indefinite"/>
                </path>
            </g>

            <!-- 气源波动控制交互按钮 -->
            <g id="btnFluctuation" class="btn" transform="translate(30, 600)">
                <rect width="220" height="40" rx="6" fill="#151A2A" stroke="#00E5FF" stroke-width="1.5" style="filter:url(#glow-cyan)"/>
                <text x="110" y="25" fill="#00E5FF" text-anchor="middle" font-size="14" font-weight="bold" id="txtFluctuation" class="unselectable">模拟气源波动: [开启]</text>
            </g>

            <!-- =================右侧:波形及数据分析区================= -->
            
            <!-- 状态面板 -->
            <g id="dataPanel" transform="translate(480, 100)">
                <rect width="650" height="40" fill="#111827" stroke="#2D3748" rx="4"/>
                <text x="15" y="25" fill="#FFF" font-size="14">腔内绝对压 (波动干扰背景):</text>
                <text x="235" y="25" fill="#00E5FF" font-size="16" font-weight="bold" id="txtPtotal">0.00 kPaA</text>
                <text x="360" y="25" fill="#A0AEC0" font-size="14" id="txtState">状态: 初始化...</text>
            </g>

            <!-- 主波形图 (对比) -->
            <g transform="translate(0, 0)">
                <!-- 图表背景及刻度线 -->
                <rect x="480" y="160" width="650" height="340" fill="rgba(10, 15, 29, 0.8)" stroke="#2D3748" stroke-width="1"/>
                
                <line x1="480" y1="210" x2="1130" y2="210" stroke="rgba(255,255,255,0.15)" stroke-dasharray="4"/>
                <text x="430" y="214" fill="#A0AEC0" font-size="11">300 kPa</text>
                
                <line x1="480" y1="363" x2="1130" y2="363" stroke="rgba(255,255,255,0.15)" stroke-dasharray="4"/>
                <text x="430" y="367" fill="#A0AEC0" font-size="11">120 kPa</text>

                <text x="440" y="495" fill="#A0AEC0" font-size="11">0 kPa</text>

                <!-- 波形路径 -->
                <path id="pathRef" fill="none" stroke="#00E5FF" stroke-width="2" style="filter: url(#glow-cyan);"/>
                <path id="pathTest" fill="none" stroke="#FF9100" stroke-width="2" style="filter: url(#glow-orange);"/>
                
                <!-- 领航点 -->
                <circle id="dotRef" r="4" fill="#00E5FF" style="filter: url(#glow-cyan);" cx="480" cy="500"/>
                <circle id="dotTest" r="4" fill="#FF9100" style="filter: url(#glow-orange);" cx="480" cy="500"/>
            </g>

            <!-- 差分分析小图表 -->
            <g transform="translate(0, 0)">
                <rect x="480" y="520" width="650" height="90" fill="#0A0F1D" stroke="#4A5568" stroke-width="1"/>
                <text x="490" y="540" fill="#B388FF" font-size="12" font-weight="bold">ΔV = TEST - REF (核心:极差波形平稳,原始波动干扰已被完全抵消)</text>
                <!-- 0 基准线 -->
                <line x1="480" y1="580" x2="1130" y2="580" stroke="rgba(255,255,255,0.2)" stroke-dasharray="4"/>
                <text x="440" y="583" fill="#B388FF" font-size="11">0 ΔV</text>

                <!-- 差分路径 -->
                <path id="pathDiff" fill="none" stroke="#B388FF" stroke-width="2" style="filter: url(#glow-purple);"/>
                <circle id="dotDiff" r="4" fill="#B388FF" style="filter: url(#glow-purple);" cx="480" cy="580"/>
            </g>

            <!-- 最终诊断结论弹窗 -->
            <g id="finalResultPanel" opacity="0" transform="translate(900, 180)">
                <rect width="210" height="150" fill="rgba(11, 25, 44, 0.95)" stroke="#B388FF" stroke-width="2" rx="6" style="filter:url(#glow-purple)"/>
                <text x="105" y="30" fill="#FFF" text-anchor="middle" font-size="16" font-weight="bold">差分诊断结论</text>
                <line x1="15" y1="42" x2="195" y2="42" stroke="#B388FF" stroke-dasharray="2,2"/>
                <text x="20" y="65" fill="#A0AEC0" font-size="13">比例系数差: <tspan fill="#FFF">2.01 %</tspan></text>
                <text x="20" y="90" fill="#A0AEC0" font-size="13">绝对零点偏: <tspan fill="#FFF">1.52 kPa</tspan></text>
                <text x="20" y="115" fill="#A0AEC0" font-size="13">相位迟滞差: <tspan fill="#FFF">&lt; 0.1 ms</tspan></text>
                <text x="105" y="140" fill="#00E5FF" text-anchor="middle" font-size="15" font-weight="bold">一致性校验: 合格</text>
            </g>

        </svg>
    </div>

    <script>
        // === 动画与业务逻辑控制 ===
        let frame = 0;
        const MAX_FRAME = 1200; // 一轮约 20 秒 (按 60fps 计)
        let fluctuationEnabled = true;

        const pathElRef = document.getElementById('pathRef');
        const pathElTest = document.getElementById('pathTest');
        const pathElDiff = document.getElementById('pathDiff');
        const dotRef = document.getElementById('dotRef');
        const dotTest = document.getElementById('dotTest');
        const dotDiff = document.getElementById('dotDiff');
        
        const txtPtotal = document.getElementById('txtPtotal');
        const txtState = document.getElementById('txtState');
        const gasChamber = document.getElementById('gasChamber');
        const finalResultPanel = document.getElementById('finalResultPanel');

        let pathDataRef = [];
        let pathDataTest = [];
        let pathDataDiff = [];

        // 缓动函数
        function lerp(a, b, t) { return a + (b - a) * t; }
        function easeInOutCubic(t) {
            return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
        }

        // 根据时序计算基础理想压力 P (0 ~ 350)
        function getBasePressure(f) {
            let p = 100; // 默认大气压 100 kPaA
            if (f < 50) p = 100;
            else if (f < 100) p = lerp(100, 130, easeInOutCubic((f - 50)/50));      // 气密微升
            else if (f < 150) p = lerp(130, 100, easeInOutCubic((f - 100)/50));     // 气密回落
            else if (f < 200) p = 100;                                              // 准备升压
            else if (f < 400) p = lerp(100, 300, easeInOutCubic((f - 200)/200));    // 升压到 300
            else if (f < 550) p = 300;                                              // 保压 300
            else if (f < 750) p = lerp(300, 100, easeInOutCubic((f - 550)/200));    // 缓慢降压
            else if (f < 850) p = lerp(100, 120, easeInOutCubic((f - 750)/100));    // 微升压校验 120
            else p = 120;                                                           // 稳定 120
            return p;
        }

        // 模拟普通气源的波动及干扰
        function getNoise(f) {
            if (!fluctuationEnabled || f > 950) return 0; // 最终展示结果时关闭随机以便清晰阅读
            // 低频慢波 + 中频振荡 + 高频小毛刺
            let slowWave = Math.sin(f * 0.05) * 8;
            let midWave = Math.sin(f * 0.17) * 4;
            let highFreq = (Math.random() - 0.5) * 3;
            return slowWave + midWave + highFreq;
        }

        // 决定状态文字
        function getStateText(f) {
            if (f < 150) return "时序动作: [步骤1] 装入样件与气密自检";
            if (f < 400) return "时序动作: [步骤2] 大范围加压 (目标300 kPaA)";
            if (f < 550) return "时序动作: [步骤3] 高压阈值保压校验";
            if (f < 750) return "时序动作: [步骤4] 缓慢泄压,捕捉动态迟滞";
            if (f < 900) return "时序动作: [步骤5] 终段微升交叉比对 (120 kPaA)";
            return "时序动作: [分析完毕] 执行差分逻辑并输出一致性矩阵";
        }

        function update() {
            let p_base = getBasePressure(frame);
            let p_noise = getNoise(frame);
            let p_total = p_base + p_noise;
            if (p_total < 0) p_total = 0;

            // 传感器模拟特性:
            // 标准参考传感器 REF (理想线性追踪总压)
            let v_ref = p_total;
            
            // 被测传感器 TEST (包含 1.5 的绝对零偏和 2% 的比例偏差,这就是我们需要算出的指标)
            let v_test = p_total * 1.02 + 1.5; 
            
            // 计算差分
            let v_diff = v_test - v_ref;

            // --- 视觉坐标映射 ---
            // 图表宽 650,X 范围 480 ~ 1130
            let curX = 480 + (frame / MAX_FRAME) * 650;

            // 主图表高度范围:160 ~ 500 (范围 340)。量程设为 400 kPa。
            let yRef = 500 - (v_ref / 400) * 340;
            let yTest = 500 - (v_test / 400) * 340;

            // 差分图表高度范围:520 ~ 610。中心基准线 580 (对应 diff = 0)。
            // 比例缩放:每 1 kPa 偏差占用 3 像素。
            let yDiff = 580 - (v_diff * 3);

            // 记录轨迹
            pathDataRef.push(`${curX},${yRef}`);
            pathDataTest.push(`${curX},${yTest}`);
            pathDataDiff.push(`${curX},${yDiff}`);

            // 渲染 DOM
            pathElRef.setAttribute('d', 'M ' + pathDataRef.join(' L '));
            pathElTest.setAttribute('d', 'M ' + pathDataTest.join(' L '));
            pathElDiff.setAttribute('d', 'M ' + pathDataDiff.join(' L '));

            dotRef.setAttribute('cx', curX); dotRef.setAttribute('cy', yRef);
            dotTest.setAttribute('cx', curX); dotTest.setAttribute('cy', yTest);
            dotDiff.setAttribute('cx', curX); dotDiff.setAttribute('cy', yDiff);

            // 更新文本与气室透明度
            txtPtotal.textContent = p_total.toFixed(2) + " kPaA";
            txtState.textContent = getStateText(frame);
            
            // 腔体光晕脉动效果
            let chamberOpacity = Math.max(0.05, Math.min(0.8, p_total / 350));
            gasChamber.setAttribute('opacity', chamberOpacity);

            // 最终结果弹窗控制
            if (frame > 950) {
                finalResultPanel.setAttribute('opacity', '1');
            } else {
                finalResultPanel.setAttribute('opacity', '0');
            }

            frame++;
            if (frame > MAX_FRAME) {
                // 循环重置
                frame = 0;
                pathDataRef = [];
                pathDataTest = [];
                pathDataDiff = [];
                pathElRef.setAttribute('d', '');
                pathElTest.setAttribute('d', '');
                pathElDiff.setAttribute('d', '');
            }

            requestAnimationFrame(update);
        }

        // 按钮交互绑定
        document.getElementById('btnFluctuation').addEventListener('click', () => {
            fluctuationEnabled = !fluctuationEnabled;
            const txt = document.getElementById('txtFluctuation');
            const rect = document.querySelector('#btnFluctuation rect');
            if (fluctuationEnabled) {
                txt.textContent = "模拟气源波动: [开启]";
                txt.setAttribute('fill', '#00E5FF');
                rect.setAttribute('stroke', '#00E5FF');
                rect.style.filter = "url(#glow-cyan)";
            } else {
                txt.textContent = "模拟气源波动: [关闭]";
                txt.setAttribute('fill', '#4A5568');
                rect.setAttribute('stroke', '#4A5568');
                rect.style.filter = "none";
            }
        });

        // 页面加载完成后自动启动连续播放
        window.addEventListener('DOMContentLoaded', () => {
            requestAnimationFrame(update);
        });
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>双传感器差分比较系统 - 理想最终解(IFR)</title>
    <style>
        :root {
            --bg-color: #0b0c10;
            --panel-bg: #1f2833;
            --std-color: #00f2fe; /* Cyan/Blue for Standard */
            --test-color: #f8b500; /* Amber for Test */
            --text-main: #c5c6c7;
            --text-muted: #6b778d;
            --grid-color: rgba(69, 162, 158, 0.15);
            --accent: #45a29e;
        }

        body, html {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
            background-color: var(--bg-color);
            font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            overflow: hidden;
            color: var(--text-main);
        }

        #animation-container {
            width: 95vw;
            height: 90vh;
            max-width: 1600px;
            max-height: 900px;
            background: radial-gradient(circle at 50% 50%, #151a22 0%, #0b0c10 100%);
            border: 1px solid rgba(69, 162, 158, 0.2);
            border-radius: 12px;
            box-shadow: 0 20px 50px rgba(0,0,0,0.8), inset 0 0 0 1px rgba(255,255,255,0.05);
            position: relative;
            display: flex;
            flex-direction: column;
        }

        /* 顶部极简信息栏 */
        .top-bar {
            position: absolute;
            top: 16px;
            left: 24px;
            right: 24px;
            display: flex;
            justify-content: space-between;
            align-items: center;
            z-index: 10;
            pointer-events: none;
        }

        .title-group h1 {
            margin: 0;
            font-size: 16px;
            font-weight: 600;
            letter-spacing: 1px;
            color: #fff;
            text-transform: uppercase;
            display: flex;
            align-items: center;
            gap: 8px;
        }

        .title-group h1::before {
            content: '';
            display: block;
            width: 6px;
            height: 6px;
            background-color: var(--std-color);
            border-radius: 50%;
            box-shadow: 0 0 8px var(--std-color);
        }

        .subtitle {
            font-size: 12px;
            color: var(--text-muted);
            margin-top: 4px;
        }

        .status-indicators {
            display: flex;
            gap: 16px;
            font-family: 'JetBrains Mono', 'Fira Code', monospace;
            font-size: 11px;
        }

        .status-item {
            display: flex;
            align-items: center;
            gap: 6px;
            background: rgba(31, 40, 51, 0.6);
            padding: 4px 10px;
            border-radius: 4px;
            border: 1px solid rgba(255,255,255,0.05);
        }

        .blink {
            animation: pulse 1.5s infinite;
        }

        @keyframes pulse {
            0% { opacity: 0.4; }
            50% { opacity: 1; }
            100% { opacity: 0.4; }
        }

        svg {
            width: 100%;
            height: 100%;
            display: block;
        }

        /* 绝对定位的小提示文本,不遮挡主体 */
        .info-panel {
            position: absolute;
            bottom: 24px;
            left: 24px;
            width: 280px;
            font-size: 12px;
            line-height: 1.5;
            color: var(--text-muted);
            background: rgba(11, 12, 16, 0.8);
            backdrop-filter: blur(10px);
            padding: 12px;
            border-left: 2px solid var(--accent);
            pointer-events: none;
        }
        
        .info-panel strong {
            color: #fff;
        }

    </style>
</head>
<body>

    <div id="animation-container">
        <div class="top-bar">
            <div class="title-group">
                <h1>双传感器差分比对系统</h1>
                <div class="subtitle">TRIZ 最终理想解: 利用同源波动消除绝对误差</div>
            </div>
            <div class="status-indicators">
                <div class="status-item"><span style="color: var(--std-color)">■</span> 标准件: 已标定</div>
                <div class="status-item"><span style="color: var(--test-color)">■</span> 被测件: 检测中</div>
                <div class="status-item"><span style="color: #ff3366" class="blink">●</span> 气源波动: 活跃</div>
                <div class="status-item">同步误差: &lt;0.1ms</div>
            </div>
        </div>

        <!-- SVG 核心动画区 -->
        <svg viewBox="0 0 1200 700" preserveAspectRatio="xMidYMid meet" id="main-svg">
            <defs>
                <!-- 发光滤镜 -->
                <filter id="glow-std" x="-20%" y="-20%" width="140%" height="140%">
                    <feGaussianBlur stdDeviation="4" result="blur" />
                    <feComposite in="SourceGraphic" in2="blur" operator="over" />
                </filter>
                <filter id="glow-test" x="-20%" y="-20%" width="140%" height="140%">
                    <feGaussianBlur stdDeviation="4" result="blur" />
                    <feComposite in="SourceGraphic" in2="blur" operator="over" />
                </filter>
                <filter id="glow-diff" x="-20%" y="-20%" width="140%" height="140%">
                    <feGaussianBlur stdDeviation="3" result="blur" />
                    <feComposite in="SourceGraphic" in2="blur" operator="over" />
                </filter>

                <!-- 渐变定义 -->
                <linearGradient id="chamber-grad" x1="0%" y1="0%" x2="100%" y2="100%">
                    <stop offset="0%" stop-color="#2a3642" />
                    <stop offset="100%" stop-color="#141a20" />
                </linearGradient>
                
                <radialGradient id="pressure-glow" cx="50%" cy="50%" r="50%">
                    <stop offset="0%" stop-color="#ff3366" stop-opacity="0.3" id="pg-stop1"/>
                    <stop offset="100%" stop-color="#ff3366" stop-opacity="0" id="pg-stop2"/>
                </radialGradient>

                <linearGradient id="pipe-grad" x1="0%" y1="0%" x2="100%" y2="0%">
                    <stop offset="0%" stop-color="#1a1a24" />
                    <stop offset="50%" stop-color="#3a4a5a" />
                    <stop offset="100%" stop-color="#1a1a24" />
                </linearGradient>

                <!-- 网格模式 -->
                <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
                    <path d="M 40 0 L 0 0 0 40" fill="none" stroke="var(--grid-color)" stroke-width="0.5"/>
                </pattern>
                
                <pattern id="fine-grid" width="10" height="10" patternUnits="userSpaceOnUse">
                    <path d="M 10 0 L 0 0 0 10" fill="none" stroke="var(--grid-color)" stroke-width="0.2"/>
                </pattern>
            </defs>

            <!-- 背景网格 (仅在图表区) -->
            <rect x="550" y="100" width="600" height="400" fill="url(#grid)" />
            <rect x="550" y="100" width="600" height="400" fill="url(#fine-grid)" />

            <!-- ================= 左侧:物理结构 ================= -->
            <g transform="translate(100, 250)">
                <!-- 进气管道 -->
                <rect x="140" y="180" width="20" height="150" fill="url(#pipe-grad)" />
                <path d="M120 330 L180 330 L160 360 L140 360 Z" fill="#2a3642" />
                <text x="150" y="380" font-size="12" fill="var(--text-muted)" text-anchor="middle">非高精度波动气源</text>
                
                <!-- 气流波动指示器 (动画) -->
                <g id="gas-flow" stroke="#ff3366" stroke-width="2" stroke-linecap="round" opacity="0.7">
                    <path d="M150 200 Q145 220 150 240 T150 280 T150 320" fill="none" />
                </g>

                <!-- 双腔分流块 (密封腔) -->
                <path d="M50,80 L250,80 L280,180 L20,180 Z" fill="url(#chamber-grad)" stroke="#45a29e" stroke-width="2"/>
                <path d="M60,90 L240,90 L265,170 L35,170 Z" fill="url(#pressure-glow)" />
                <text x="150" y="140" font-size="14" fill="#fff" text-anchor="middle" font-weight="bold" opacity="0.8">同源密闭压力腔</text>
                <text x="150" y="160" font-size="10" fill="var(--text-muted)" text-anchor="middle">两级锥面快装结构</text>

                <!-- 标准传感器 (左) -->
                <g transform="translate(80, 20)">
                    <rect x="-25" y="0" width="50" height="60" fill="#1f2833" stroke="var(--std-color)" stroke-width="2" rx="4"/>
                    <rect x="-15" y="60" width="30" height="20" fill="#3a4a5a" />
                    <circle cx="0" cy="30" r="10" fill="var(--std-color)" filter="url(#glow-std)"/>
                    <text x="0" y="-15" font-size="12" fill="var(--std-color)" text-anchor="middle">参考传感器</text>
                    <text x="0" y="-3" font-size="10
积分规则:每轮对话扣10分