fix(report): correct Local G2 visual invariants
This commit is contained in:
+8
-8
@@ -48,15 +48,15 @@
|
|||||||
</defs>
|
</defs>
|
||||||
<rect x="0" y="0" width="1200" height="720" fill="#fbfcff"/>
|
<rect x="0" y="0" width="1200" height="720" fill="#fbfcff"/>
|
||||||
<g fill="none" stroke="#dce4ee" stroke-width="1"><path d="M80 100H1120M80 220H1120M80 340H1120M80 460H1120M80 580H1120"/><path d="M120 70V610M300 70V610M480 70V610M660 70V610M840 70V610M1020 70V610"/></g>
|
<g fill="none" stroke="#dce4ee" stroke-width="1"><path d="M80 100H1120M80 220H1120M80 340H1120M80 460H1120M80 580H1120"/><path d="M120 70V610M300 70V610M480 70V610M660 70V610M840 70V610M1020 70V610"/></g>
|
||||||
<g aria-label="始终可见的典型原始路径"><path class="coarse-path-outside" d="M120 525 L290 462" fill="none" stroke="#9aa6b5" stroke-width="12" stroke-linejoin="round"/><path class="coarse-path-window" d="M290 462 L420 462 L520 350 L690 258" fill="none" stroke="#9aa6b5" stroke-width="12" stroke-linejoin="round"/><path class="coarse-path-outside" d="M690 258 L885 220 L1080 170" fill="none" stroke="#9aa6b5" stroke-width="12" stroke-linejoin="round"/><path class="coarse-path-outside" d="M120 525 L290 462" fill="none" stroke="#fff" stroke-width="3" stroke-dasharray="4 11"/><path class="coarse-path-window" d="M290 462 L420 462 L520 350 L690 258" fill="none" stroke="#fff" stroke-width="3" stroke-dasharray="4 11"/><path class="coarse-path-outside" d="M690 258 L885 220 L1080 170" fill="none" stroke="#fff" stroke-width="3" stroke-dasharray="4 11"/>
|
<g aria-label="始终可见的典型原始路径"><path class="coarse-path-outside" d="M120 462 L290 462" fill="none" stroke="#9aa6b5" stroke-width="12" stroke-linejoin="round"/><path class="coarse-path-window" d="M290 462 L420 462 L520 350 L690 258" fill="none" stroke="#9aa6b5" stroke-width="12" stroke-linejoin="round"/><path class="coarse-path-outside" d="M690 258 L885 133 L1080 95" fill="none" stroke="#9aa6b5" stroke-width="12" stroke-linejoin="round"/><path class="coarse-path-outside" d="M120 462 L290 462" fill="none" stroke="#fff" stroke-width="3" stroke-dasharray="4 11"/><path class="coarse-path-window" d="M290 462 L420 462 L520 350 L690 258" fill="none" stroke="#fff" stroke-width="3" stroke-dasharray="4 11"/><path class="coarse-path-outside" d="M690 258 L885 133 L1080 95" fill="none" stroke="#fff" stroke-width="3" stroke-dasharray="4 11"/>
|
||||||
<g fill="#617086"><circle cx="120" cy="525" r="8"/><circle cx="290" cy="462" r="8"/><circle cx="420" cy="462" r="8"/><circle cx="520" cy="350" r="8"/><circle cx="690" cy="258" r="8"/><circle cx="885" cy="220" r="8"/><circle cx="1080" cy="170" r="8"/></g>
|
<g fill="#617086"><circle cx="120" cy="462" r="8"/><circle cx="290" cy="462" r="8"/><circle cx="420" cy="462" r="8"/><circle cx="520" cy="350" r="8"/><circle cx="690" cy="258" r="8"/><circle cx="885" cy="133" r="8"/><circle cx="1080" cy="95" r="8"/></g>
|
||||||
<text x="92" y="565" fill="#15243a" font-weight="700">起点</text><text x="1050" y="148" fill="#15243a" font-weight="700">终点</text><path d="M145 515 l70 -26" stroke="#1976d2" stroke-width="4" marker-end="url(#arrow-blue)"/><text x="148" y="490" fill="#1976d2">行驶方向</text></g>
|
<text x="92" y="502" fill="#15243a" font-weight="700">起点</text><text x="1050" y="73" fill="#15243a" font-weight="700">终点</text><path d="M145 462 h70" stroke="#1976d2" stroke-width="4" marker-end="url(#arrow-blue)"/><text x="148" y="447" fill="#1976d2">行驶方向</text></g>
|
||||||
<g class="scene-layer scene-0"><circle cx="420" cy="462" r="22" fill="none" stroke="#c33b3b" stroke-width="4"/><path d="M398 431 L439 485 M441 431 L400 485" stroke="#c33b3b" stroke-width="4"/><text x="446" y="454" fill="#c33b3b" font-weight="700">κ 跳变</text><text x="84" y="90" fill="#617086" font-size="18">离散点 + 原始折线:局部接口存在方向/曲率突变</text></g>
|
<g class="scene-layer scene-0"><circle cx="420" cy="462" r="22" fill="none" stroke="#c33b3b" stroke-width="4"/><path d="M398 431 L439 485 M441 431 L400 485" stroke="#c33b3b" stroke-width="4"/><text x="446" y="454" fill="#c33b3b" font-weight="700">κ 跳变</text><text x="84" y="90" fill="#617086" font-size="18">离散点 + 原始折线:局部接口存在方向/曲率突变</text></g>
|
||||||
<g class="scene-layer scene-1"><rect x="290" y="184" width="400" height="340" rx="18" fill="#dbeeff" opacity=".7"/><line x1="290" y1="180" x2="290" y2="535" stroke="#1976d2" stroke-width="4" stroke-dasharray="10 8"/><line x1="690" y1="180" x2="690" y2="535" stroke="#1976d2" stroke-width="4" stroke-dasharray="10 8"/><text x="300" y="210" fill="#1976d2" font-weight="700">局部窗口:只处理跳变附近</text><text x="252" y="555" fill="#1976d2">窗口边界</text><text x="650" y="555" fill="#1976d2">窗口边界</text></g>
|
<g class="scene-layer scene-1"><rect x="290" y="184" width="400" height="340" rx="18" fill="#dbeeff" opacity=".7"/><line x1="290" y1="180" x2="290" y2="535" stroke="#1976d2" stroke-width="4" stroke-dasharray="10 8"/><line x1="690" y1="180" x2="690" y2="535" stroke="#1976d2" stroke-width="4" stroke-dasharray="10 8"/><text x="300" y="210" fill="#1976d2" font-weight="700">局部窗口:只处理跳变附近</text><text x="252" y="555" fill="#1976d2">窗口边界</text><text x="650" y="555" fill="#1976d2">窗口边界</text></g>
|
||||||
<g class="scene-layer scene-2"><path d="M290 462 h180 M690 258 l150 -96" stroke="#1976d2" stroke-width="4" marker-end="url(#arrow-blue)"/><path d="M310 432 Q350 400 388 438 M660 290 Q700 315 730 270" fill="none" stroke="#1976d2" stroke-width="3" stroke-dasharray="8 7"/><text x="334" y="401" fill="#1976d2">二阶趋势</text><text x="737" y="253" fill="#1976d2">端点切向</text><path id="quintic-candidate" fill="none" stroke="#1976d2" stroke-width="7" stroke-dasharray="13 8"/><text x="430" y="300" fill="#1976d2" font-weight="700">五次 Hermite 候选(位置 + 切向 + 二阶趋势)</text></g>
|
<g class="scene-layer scene-2"><path d="M290 462 h180 M690 258 l156 -100" stroke="#1976d2" stroke-width="4" marker-end="url(#arrow-blue)"/><path d="M310 432 Q350 400 388 438 M660 290 Q700 315 730 270" fill="none" stroke="#1976d2" stroke-width="3" stroke-dasharray="8 7"/><text x="334" y="401" fill="#1976d2">二阶趋势</text><text x="737" y="253" fill="#1976d2">端点切向</text><path id="quintic-candidate" fill="none" stroke="#1976d2" stroke-width="7" stroke-dasharray="13 8"/><text x="430" y="300" fill="#1976d2" font-weight="700">五次 Hermite 候选(位置 + 切向 + 二阶趋势)</text></g>
|
||||||
<g class="scene-layer scene-3"><path id="replacement-candidate" fill="none" stroke="#1d8a5b" stroke-width="10"/><circle cx="290" cy="462" r="13" fill="white" stroke="#1d8a5b" stroke-width="5"/><circle cx="690" cy="258" r="13" fill="white" stroke="#1d8a5b" stroke-width="5"/><text x="245" y="430" fill="#1d8a5b" font-weight="700">替换开始</text><text x="650" y="235" fill="#1d8a5b" font-weight="700">替换结束</text><text x="410" y="520" fill="#1d8a5b" font-weight="700">绿色候选覆盖灰色原折线</text></g>
|
<g class="scene-layer scene-3"><path id="replacement-candidate" fill="none" stroke="#1d8a5b" stroke-width="10"/><circle cx="290" cy="462" r="13" fill="white" stroke="#1d8a5b" stroke-width="5"/><circle cx="690" cy="258" r="13" fill="white" stroke="#1d8a5b" stroke-width="5"/><text x="245" y="430" fill="#1d8a5b" font-weight="700">替换开始</text><text x="650" y="235" fill="#1d8a5b" font-weight="700">替换结束</text><text x="410" y="520" fill="#1d8a5b" font-weight="700">绿色候选覆盖灰色原折线</text></g>
|
||||||
<g class="scene-layer scene-4"><rect x="70" y="70" width="1060" height="245" rx="16" fill="#f0faf5" stroke="#b8dfca"/><path id="continuity-candidate" fill="none" stroke="#1d8a5b" stroke-width="9"/><text x="90" y="105" fill="#1d8a5b" font-weight="700">替换后路径:窗口外不变,接口趋势连续</text><g transform="translate(110 500)"><path d="M0 0V150M0 150H850" stroke="#617086" stroke-width="3"/><text x="-20" y="5" fill="#617086">κ</text><text x="855" y="160" fill="#617086">s</text><path d="M60 118 L290 118 L300 38 L520 38" stroke="#c33b3b" stroke-width="6" fill="none"/><path d="M60 118 C230 118 280 106 355 84 S465 46 520 38" stroke="#1d8a5b" stroke-width="6" fill="none"/><text x="535" y="43" fill="#c33b3b">原始跳变</text><text x="535" y="73" fill="#1d8a5b">候选连续过渡</text><text x="520" y="130" fill="#617086">趋势示意,非实测数据</text></g></g>
|
<g class="scene-layer scene-4"><rect x="70" y="70" width="1060" height="420" rx="16" fill="#f0faf5" stroke="#b8dfca"/><path id="continuity-candidate" fill="none" stroke="#1d8a5b" stroke-width="9"/><text x="90" y="105" fill="#1d8a5b" font-weight="700">替换后路径:窗口外不变,接口趋势连续</text><g transform="translate(110 530)"><path d="M0 0V150M0 150H850" stroke="#617086" stroke-width="3"/><text x="-20" y="5" fill="#617086">κ</text><text x="855" y="160" fill="#617086">s</text><path d="M60 118 L290 118 L300 38 L520 38" stroke="#c33b3b" stroke-width="6" fill="none"/><path d="M60 118 C230 118 280 106 355 84 S465 46 520 38" stroke="#1d8a5b" stroke-width="6" fill="none"/><text x="535" y="43" fill="#c33b3b">原始跳变</text><text x="535" y="73" fill="#1d8a5b">候选连续过渡</text><text x="520" y="130" fill="#617086">趋势示意,非实测数据</text></g></g>
|
||||||
<g class="scene-layer scene-5"><path id="safety-candidate" fill="none" stroke="#1d8a5b" stroke-width="36" opacity=".18"/><path id="accepted-candidate" fill="none" stroke="#1d8a5b" stroke-width="8"/><g fill="#fff" stroke="#1d8a5b" stroke-width="4"><circle cx="300" cy="462" r="13"/><circle cx="500" cy="382" r="13"/><circle cx="680" cy="266" r="13"/></g><g fill="#1d8a5b" font-weight="700"><text x="720" y="370">✓ 碰撞(完整车体安全)</text><text x="720" y="402">✓ 净空</text><text x="720" y="434">✓ 曲率</text><text x="720" y="466">✓ 偏移</text></g><g transform="translate(320 435) rotate(0)"><rect x="-28" y="-15" width="56" height="30" rx="6" fill="#fff" stroke="#1d8a5b" stroke-width="4"/><circle cx="-17" cy="18" r="5"/><circle cx="17" cy="18" r="5"/></g><g transform="translate(500 348) rotate(-30)"><rect x="-28" y="-15" width="56" height="30" rx="6" fill="#fff" stroke="#1d8a5b" stroke-width="4"/><circle cx="-17" cy="18" r="5"/><circle cx="17" cy="18" r="5"/></g><g transform="translate(660 278) rotate(-28)"><rect x="-28" y="-15" width="56" height="30" rx="6" fill="#fff" stroke="#1d8a5b" stroke-width="4"/><circle cx="-17" cy="18" r="5"/><circle cx="17" cy="18" r="5"/></g><text x="90" y="90" fill="#1d8a5b" font-size="18">通过质量门后才接受候选;任一门阻断则回退原路径</text><text x="90" y="120" fill="#617086" font-size="16">车辆轮廓为机制示意,非实测数据</text></g>
|
<g class="scene-layer scene-5"><path id="safety-candidate" fill="none" stroke="#1d8a5b" stroke-width="36" opacity=".18"/><path id="accepted-candidate" fill="none" stroke="#1d8a5b" stroke-width="8"/><g fill="#fff" stroke="#1d8a5b" stroke-width="4"><circle cx="300" cy="462" r="13"/><circle cx="500" cy="382" r="13"/><circle cx="680" cy="266" r="13"/></g><g fill="#1d8a5b" font-weight="700"><text x="720" y="370">✓ 碰撞(完整车体安全)</text><text x="720" y="402">✓ 净空</text><text x="720" y="434">✓ 曲率</text><text x="720" y="466">✓ 偏移</text></g><g transform="translate(320 435) rotate(0)"><rect x="-28" y="-15" width="56" height="30" rx="6" fill="#fff" stroke="#1d8a5b" stroke-width="4"/><circle cx="-17" cy="18" r="5"/><circle cx="17" cy="18" r="5"/></g><g transform="translate(500 348) rotate(-30)"><rect x="-28" y="-15" width="56" height="30" rx="6" fill="#fff" stroke="#1d8a5b" stroke-width="4"/><circle cx="-17" cy="18" r="5"/><circle cx="17" cy="18" r="5"/></g><g transform="translate(660 278) rotate(-28)"><rect x="-28" y="-15" width="56" height="30" rx="6" fill="#fff" stroke="#1d8a5b" stroke-width="4"/><circle cx="-17" cy="18" r="5"/><circle cx="17" cy="18" r="5"/></g><text x="90" y="90" fill="#1d8a5b" font-size="18">通过质量门后才接受候选;任一门阻断则回退原路径</text><text x="90" y="120" fill="#617086" font-size="16">车辆轮廓为机制示意,非实测数据</text><path d="M1020 478V500" fill="none" stroke="#c33b3b" stroke-width="3" stroke-dasharray="7 6" marker-end="url(#arrow-red)"/><rect x="720" y="515" width="390" height="72" rx="10" fill="#fff0f1" stroke="#c33b3b" stroke-width="3"/><text x="742" y="543" fill="#c33b3b" font-weight="700">条件分支:任一门失败</text><text x="742" y="570" fill="#c33b3b" font-weight="700">拒绝候选 → 回退灰色原路径</text></g>
|
||||||
<g transform="translate(80 675)"><rect width="22" height="12" fill="#9aa6b5"/><text x="30" y="12" fill="#617086">原始粗路径</text><rect x="185" width="22" height="12" fill="#1976d2"/><text x="215" y="12" fill="#617086">窗口/约束</text><rect x="340" width="22" height="12" fill="#1d8a5b"/><text x="370" y="12" fill="#617086">已接受候选</text><rect x="535" width="22" height="12" fill="#bd7900"/><text x="565" y="12" fill="#617086">发布边界</text><rect x="705" width="22" height="12" fill="#c33b3b"/><text x="735" y="12" fill="#617086">拒绝/阻断</text></g>
|
<g transform="translate(80 675)"><rect width="22" height="12" fill="#9aa6b5"/><text x="30" y="12" fill="#617086">原始粗路径</text><rect x="185" width="22" height="12" fill="#1976d2"/><text x="215" y="12" fill="#617086">窗口/约束</text><rect x="340" width="22" height="12" fill="#1d8a5b"/><text x="370" y="12" fill="#617086">已接受候选</text><rect x="535" width="22" height="12" fill="#bd7900"/><text x="565" y="12" fill="#617086">发布边界</text><rect x="705" width="22" height="12" fill="#c33b3b"/><text x="735" y="12" fill="#617086">拒绝/阻断</text></g>
|
||||||
</svg>
|
</svg>
|
||||||
</section>
|
</section>
|
||||||
@@ -66,8 +66,8 @@
|
|||||||
<script>
|
<script>
|
||||||
const hermite = {
|
const hermite = {
|
||||||
p0: { x: 290, y: 462 }, p1: { x: 690, y: 258 },
|
p0: { x: 290, y: 462 }, p1: { x: 690, y: 258 },
|
||||||
d0: { x: 180, y: 0 }, d1: { x: 210, y: -135 },
|
d0: { x: 180, y: 0 }, d1: { x: 195, y: -125 },
|
||||||
a0: { x: 0, y: -18 }, a1: { x: 22, y: -12 }
|
a0: { x: 0, y: 0 }, a1: { x: 0, y: 0 }
|
||||||
};
|
};
|
||||||
function quinticBasis(t) {
|
function quinticBasis(t) {
|
||||||
const t2 = t * t, t3 = t2 * t, t4 = t3 * t, t5 = t4 * t;
|
const t2 = t * t, t3 = t2 * t, t4 = t3 * t, t5 = t4 * t;
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@
|
|||||||
button:focus-visible { outline:3px solid #f0ad32; outline-offset:3px; }
|
button:focus-visible { outline:3px solid #f0ad32; outline-offset:3px; }
|
||||||
.issue-stage { background:var(--panel); border:1px solid var(--line); border-radius:16px; padding:22px; box-shadow:0 4px 12px #15364d0d; }
|
.issue-stage { background:var(--panel); border:1px solid var(--line); border-radius:16px; padding:22px; box-shadow:0 4px 12px #15364d0d; }
|
||||||
#issue-evidence { display:inline-block; margin-bottom:5px; color:var(--info); font-size:.87rem; font-weight:800; }
|
#issue-evidence { display:inline-block; margin-bottom:5px; color:var(--info); font-size:.87rem; font-weight:800; }
|
||||||
.visual-wrap { overflow-x:auto; margin:18px -4px; padding:4px; } #issue-visual { display:block; width:100%; min-width:870px; height:auto; }
|
.visual-wrap { margin:18px -4px; padding:4px; } #issue-visual { display:block; width:100%; height:auto; }
|
||||||
.issue-scene { display:none; } #local-g2-issue-demo[data-issue="baseline"] .issue-scene[data-issue="baseline"], #local-g2-issue-demo[data-issue="window"] .issue-scene[data-issue="window"], #local-g2-issue-demo[data-issue="arclength"] .issue-scene[data-issue="arclength"] { display:block; }
|
.issue-scene { display:none; } #local-g2-issue-demo[data-issue="baseline"] .issue-scene[data-issue="baseline"], #local-g2-issue-demo[data-issue="window"] .issue-scene[data-issue="window"], #local-g2-issue-demo[data-issue="arclength"] .issue-scene[data-issue="arclength"] { display:block; }
|
||||||
.compare-copy { display:grid; grid-template-columns:repeat(3,1fr); gap:13px; } .compare-copy article { border:1px solid var(--line); border-radius:10px; padding:14px; } .compare-copy article:nth-child(1) { border-top:4px solid var(--actual); } .compare-copy article:nth-child(2) { border-top:4px solid var(--expected); } .compare-copy article:nth-child(3) { border-top:4px solid var(--info); } .compare-copy p { margin-bottom:0; }
|
.compare-copy { display:grid; grid-template-columns:repeat(3,1fr); gap:13px; } .compare-copy article { border:1px solid var(--line); border-radius:10px; padding:14px; } .compare-copy article:nth-child(1) { border-top:4px solid var(--actual); } .compare-copy article:nth-child(2) { border-top:4px solid var(--expected); } .compare-copy article:nth-child(3) { border-top:4px solid var(--info); } .compare-copy p { margin-bottom:0; }
|
||||||
.next-action { margin:15px 0 0; padding:12px 14px; border-radius:9px; background:#edf4f7; } .issue-controls { justify-content:space-between; margin-top:14px; } .issue-controls button { background:#eaf2f5; }
|
.next-action { margin:15px 0 0; padding:12px 14px; border-radius:9px; background:#edf4f7; } .issue-controls { justify-content:space-between; margin-top:14px; } .issue-controls button { background:#eaf2f5; }
|
||||||
|
|||||||
Reference in New Issue
Block a user