Files
ViewDesignEngine/docs/api/group__curves.html
T
茂之钳 2f111edcd5
CI / Build & Test (push) Failing after 33s
CI / Release Build (push) Failing after 31s
Build & Test / build-and-test (push) Has been cancelled
Build & Test / python-bindings (push) Has been cancelled
docs: generated API documentation (483 pages)
2026-07-24 11:55:47 +00:00

652 lines
42 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ViewDesignEngine: 曲线曲面模块 (vde::curves)</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">ViewDesignEngine
&#160;<span id="projectnumber">3.1.0</span>
</div>
<div id="projectbrief">高性能 CAD 计算几何引擎</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'搜索','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('group__curves.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes"></a> &#124;
<a href="#func-members">函数</a> </div>
<div class="headertitle">
<div class="title">曲线曲面模块 (vde::curves)</div> </div>
</div><!--header-->
<div class="contents">
<p>Bézier、B-Spline、NURBS 曲线与曲面的求值、求导、细分
<a href="#details">更多...</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1curves_1_1BezierCurve.html">vde::curves::BezierCurve</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">任意阶 Bézier 曲线 <a href="classvde_1_1curves_1_1BezierCurve.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1curves_1_1BezierSurface.html">vde::curves::BezierSurface</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Bézier 张量积曲面 <a href="classvde_1_1curves_1_1BezierSurface.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1curves_1_1BSplineCurve.html">vde::curves::BSplineCurve</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">B 样条曲线(非有理、均匀/非均匀节点) <a href="classvde_1_1curves_1_1BSplineCurve.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1curves_1_1BSplineSurface.html">vde::curves::BSplineSurface</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">B 样条张量积曲面(非有理) <a href="classvde_1_1curves_1_1BSplineSurface.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">vde::curves::NurbsCurve</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">NURBS 曲线(Non-Uniform Rational B-Spline <a href="classvde_1_1curves_1_1NurbsCurve.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">vde::curves::NurbsSurface</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">NURBS 张量积曲面 <a href="classvde_1_1curves_1_1NurbsSurface.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
函数</h2></td></tr>
<tr class="memitem:gabfdf74f116bf265b378972b6a2081018"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curves.html#gabfdf74f116bf265b378972b6a2081018">vde::curves::offset_surface</a> (const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;surf, double distance)</td></tr>
<tr class="memdesc:gabfdf74f116bf265b378972b6a2081018"><td class="mdescLeft">&#160;</td><td class="mdescRight">NURBS 曲面等距偏移 <a href="group__curves.html#gabfdf74f116bf265b378972b6a2081018">更多...</a><br /></td></tr>
<tr class="separator:gabfdf74f116bf265b378972b6a2081018"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gafdf84393ce3a052eb842dca1e1b5ecc7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curves.html#gafdf84393ce3a052eb842dca1e1b5ecc7">vde::curves::trim_surface</a> (const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;surf, double u_min, double u_max, double v_min, double v_max)</td></tr>
<tr class="memdesc:gafdf84393ce3a052eb842dca1e1b5ecc7"><td class="mdescLeft">&#160;</td><td class="mdescRight">NURBS 曲面参数域裁剪 <a href="group__curves.html#gafdf84393ce3a052eb842dca1e1b5ecc7">更多...</a><br /></td></tr>
<tr class="separator:gafdf84393ce3a052eb842dca1e1b5ecc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad3cc80681a4081099a7527e524fa0bbd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curves.html#gad3cc80681a4081099a7527e524fa0bbd">vde::curves::blend_surfaces</a> (const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;surf_a, const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;surf_b, int edge_a, int edge_b, double blend_radius)</td></tr>
<tr class="memdesc:gad3cc80681a4081099a7527e524fa0bbd"><td class="mdescLeft">&#160;</td><td class="mdescRight">两 NURBS 曲面沿边界边的过渡面 <a href="group__curves.html#gad3cc80681a4081099a7527e524fa0bbd">更多...</a><br /></td></tr>
<tr class="separator:gad3cc80681a4081099a7527e524fa0bbd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga7580a509f2049a0154a695c641a59c5a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curves.html#ga7580a509f2049a0154a695c641a59c5a">vde::curves::ruled_surface</a> (const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;curve_a, const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;curve_b)</td></tr>
<tr class="memdesc:ga7580a509f2049a0154a695c641a59c5a"><td class="mdescLeft">&#160;</td><td class="mdescRight">两 NURBS 曲线间的直纹面 <a href="group__curves.html#ga7580a509f2049a0154a695c641a59c5a">更多...</a><br /></td></tr>
<tr class="separator:ga7580a509f2049a0154a695c641a59c5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0e1b2c10581b040e266b5862f31b6740"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curves.html#ga0e1b2c10581b040e266b5862f31b6740">vde::curves::coons_patch</a> (const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;curve_u0, const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;curve_u1, const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;curve_v0, const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;curve_v1)</td></tr>
<tr class="memdesc:ga0e1b2c10581b040e266b5862f31b6740"><td class="mdescLeft">&#160;</td><td class="mdescRight">由四条边界曲线创建 Coons 曲面 <a href="group__curves.html#ga0e1b2c10581b040e266b5862f31b6740">更多...</a><br /></td></tr>
<tr class="separator:ga0e1b2c10581b040e266b5862f31b6740"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4cab0f3ff296fdc05053eacac91f871f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curves.html#ga4cab0f3ff296fdc05053eacac91f871f">vde::curves::extrude_curve</a> (const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;curve, const Vector3D &amp;direction, double length)</td></tr>
<tr class="memdesc:ga4cab0f3ff296fdc05053eacac91f871f"><td class="mdescLeft">&#160;</td><td class="mdescRight">沿方向向量拉伸 NURBS 曲线为曲面 <a href="group__curves.html#ga4cab0f3ff296fdc05053eacac91f871f">更多...</a><br /></td></tr>
<tr class="separator:ga4cab0f3ff296fdc05053eacac91f871f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga04aae3cd810d0e289e61b699b04113c6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curves.html#ga04aae3cd810d0e289e61b699b04113c6">vde::curves::extract_boundary_curve</a> (const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;surf, int edge)</td></tr>
<tr class="memdesc:ga04aae3cd810d0e289e61b699b04113c6"><td class="mdescLeft">&#160;</td><td class="mdescRight">提取 NURBS 曲面的等参边界曲线 <a href="group__curves.html#ga04aae3cd810d0e289e61b699b04113c6">更多...</a><br /></td></tr>
<tr class="separator:ga04aae3cd810d0e289e61b699b04113c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa17077923ccc4097a7dc783238c93c14"><td class="memItemLeft" align="right" valign="top">std::pair&lt; std::vector&lt; Point3D &gt;, std::vector&lt; std::array&lt; int, 3 &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curves.html#gaa17077923ccc4097a7dc783238c93c14">vde::curves::tessellate</a> (const std::function&lt; Point3D(double, double)&gt; &amp;eval, int res_u, int res_v)</td></tr>
<tr class="memdesc:gaa17077923ccc4097a7dc783238c93c14"><td class="mdescLeft">&#160;</td><td class="mdescRight">均匀参数化曲面三角化 <a href="group__curves.html#gaa17077923ccc4097a7dc783238c93c14">更多...</a><br /></td></tr>
<tr class="separator:gaa17077923ccc4097a7dc783238c93c14"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad5446ff8b077aecdad4ed145ccc681b8"><td class="memItemLeft" align="right" valign="top">std::pair&lt; std::vector&lt; Point3D &gt;, std::vector&lt; std::array&lt; int, 3 &gt; &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curves.html#gad5446ff8b077aecdad4ed145ccc681b8">vde::curves::adaptive_tessellate</a> (const std::function&lt; Point3D(double, double)&gt; &amp;eval, const std::function&lt; Vector3D(double, double)&gt; &amp;normal_fn, int min_res=2, int max_depth=6, double angle_threshold_deg=5.0)</td></tr>
<tr class="memdesc:gad5446ff8b077aecdad4ed145ccc681b8"><td class="mdescLeft">&#160;</td><td class="mdescRight">自适应曲面三角化 <a href="group__curves.html#gad5446ff8b077aecdad4ed145ccc681b8">更多...</a><br /></td></tr>
<tr class="separator:gad5446ff8b077aecdad4ed145ccc681b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">详细描述</h2>
<p>Bézier、B-Spline、NURBS 曲线与曲面的求值、求导、细分 </p>
<h2 class="groupheader">函数说明</h2>
<a id="gad5446ff8b077aecdad4ed145ccc681b8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gad5446ff8b077aecdad4ed145ccc681b8">&#9670;&nbsp;</a></span>adaptive_tessellate()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::pair&lt;std::vector&lt;Point3D&gt;, std::vector&lt;std::array&lt;int, 3&gt; &gt; &gt; vde::curves::adaptive_tessellate </td>
<td>(</td>
<td class="paramtype">const std::function&lt; Point3D(double, double)&gt; &amp;&#160;</td>
<td class="paramname"><em>eval</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::function&lt; Vector3D(double, double)&gt; &amp;&#160;</td>
<td class="paramname"><em>normal_fn</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>min_res</em> = <code>2</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>max_depth</em> = <code>6</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>angle_threshold_deg</em> = <code>5.0</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>自适应曲面三角化 </p>
<p>基于法向角度偏差的自适应细分策略: 从 min_res×min_res 初始网格开始,对每个四边形检查四个角点的法向偏差。 若任意相邻角点间的法向夹角超过 angle_threshold_deg,则将该四边形四分细分。</p>
<p>相比均匀 <a class="el" href="group__curves.html#gaa17077923ccc4097a7dc783238c93c14" title="均匀参数化曲面三角化">tessellate()</a> 的优点:</p><ul>
<li>曲率大的区域自动增加采样密度</li>
<li>平坦区域保持粗糙网格,节省面数</li>
</ul>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">eval</td><td>曲面求值函数 eval(u,v) -&gt; Point3D </td></tr>
<tr><td class="paramname">normal_fn</td><td>单位法向函数 normal_fn(u,v) -&gt; Vector3D </td></tr>
<tr><td class="paramname">min_res</td><td>初始每向子分段数(≥ 1),默认 2 </td></tr>
<tr><td class="paramname">max_depth</td><td>最大递归深度,限制总面数,默认 6 </td></tr>
<tr><td class="paramname">angle_threshold_deg</td><td>法向角度偏差阈值(度),默认 5.0 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>{顶点数组, 三角形索引数组}</dd></dl>
<dl class="section note"><dt>注解</dt><dd>最终面数上限约为 2·min_res²·4^max_depth(实际远小于此上限) <div class="fragment"><div class="line"><span class="keyword">auto</span> [verts, tris] = <a class="code" href="group__curves.html#gad5446ff8b077aecdad4ed145ccc681b8">adaptive_tessellate</a>(</div>
<div class="line"> [&amp;](<span class="keywordtype">double</span> u, <span class="keywordtype">double</span> v) { <span class="keywordflow">return</span> surf.evaluate(u,v); },</div>
<div class="line"> [&amp;](<span class="keywordtype">double</span> u, <span class="keywordtype">double</span> v) { <span class="keywordflow">return</span> surf.normal(u,v); },</div>
<div class="line"> 2, 5, 3.0); <span class="comment">// 3° 偏差阈值,最大深度 5</span></div>
<div class="ttc" id="agroup__curves_html_gad5446ff8b077aecdad4ed145ccc681b8"><div class="ttname"><a href="group__curves.html#gad5446ff8b077aecdad4ed145ccc681b8">vde::curves::adaptive_tessellate</a></div><div class="ttdeci">std::pair&lt; std::vector&lt; Point3D &gt;, std::vector&lt; std::array&lt; int, 3 &gt; &gt; &gt; adaptive_tessellate(const std::function&lt; Point3D(double, double)&gt; &amp;eval, const std::function&lt; Vector3D(double, double)&gt; &amp;normal_fn, int min_res=2, int max_depth=6, double angle_threshold_deg=5.0)</div><div class="ttdoc">自适应曲面三角化</div></div>
</div><!-- fragment --> </dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="group__curves.html#gaa17077923ccc4097a7dc783238c93c14" title="均匀参数化曲面三角化">tessellate</a> </dd></dl>
</div>
</div>
<a id="gad3cc80681a4081099a7527e524fa0bbd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gad3cc80681a4081099a7527e524fa0bbd">&#9670;&nbsp;</a></span>blend_surfaces()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> vde::curves::blend_surfaces </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;&#160;</td>
<td class="paramname"><em>surf_a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;&#160;</td>
<td class="paramname"><em>surf_b</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>edge_a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>edge_b</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>blend_radius</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>两 NURBS 曲面沿边界边的过渡面 </p>
<p>提取两个曲面的指定边界曲线,各沿法向向内偏移 blend_radius 后, 在两偏移曲线之间创建直纹面作为过渡。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">surf_a</td><td>第一个曲面 </td></tr>
<tr><td class="paramname">surf_b</td><td>第二个曲面 </td></tr>
<tr><td class="paramname">edge_a</td><td>surf_a 的边界边索引(0=u_min, 1=u_max, 2=v_min, 3=v_max </td></tr>
<tr><td class="paramname">edge_b</td><td>surf_b 的边界边索引(0=u_min, 1=u_max, 2=v_min, 3=v_max </td></tr>
<tr><td class="paramname">blend_radius</td><td>过渡半径 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>过渡 NURBS 曲面(在偏移边界曲线间的直纹面)</dd></dl>
<dl class="section note"><dt>注解</dt><dd>过渡面与原始曲面在边界处为 C⁰ 连续(非切线连续) <div class="fragment"><div class="line"><span class="comment">// surf_a 的 u_max 边过渡到 surf_b 的 u_min 边</span></div>
<div class="line"><span class="keyword">auto</span> blend = <a class="code" href="group__curves.html#gad3cc80681a4081099a7527e524fa0bbd">blend_surfaces</a>(surf_a, surf_b,</div>
<div class="line"> 1, 0, <span class="comment">// edge indices: umax → umin</span></div>
<div class="line"> 0.5); <span class="comment">// blend radius</span></div>
<div class="ttc" id="agroup__curves_html_gad3cc80681a4081099a7527e524fa0bbd"><div class="ttname"><a href="group__curves.html#gad3cc80681a4081099a7527e524fa0bbd">vde::curves::blend_surfaces</a></div><div class="ttdeci">NurbsSurface blend_surfaces(const NurbsSurface &amp;surf_a, const NurbsSurface &amp;surf_b, int edge_a, int edge_b, double blend_radius)</div><div class="ttdoc">两 NURBS 曲面沿边界边的过渡面</div></div>
</div><!-- fragment --> </dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="group__curves.html#ga7580a509f2049a0154a695c641a59c5a" title="两 NURBS 曲线间的直纹面">ruled_surface</a> </dd></dl>
</div>
</div>
<a id="ga0e1b2c10581b040e266b5862f31b6740"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga0e1b2c10581b040e266b5862f31b6740">&#9670;&nbsp;</a></span>coons_patch()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> vde::curves::coons_patch </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;&#160;</td>
<td class="paramname"><em>curve_u0</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;&#160;</td>
<td class="paramname"><em>curve_u1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;&#160;</td>
<td class="paramname"><em>curve_v0</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;&#160;</td>
<td class="paramname"><em>curve_v1</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>由四条边界曲线创建 Coons 曲面 </p>
<p>双线性混合: S(u,v) = (1-u)·C_{v0}(v) + u·C_{v1}(v)</p><ul>
<li>(1-v)·C_{u0}(u) + v·C_{u1}(u)</li>
<li>角点修正项</li>
</ul>
<p>四条曲线须围成闭合环且有兼容的阶次/节点结构。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">curve_u0</td><td>v=0 处边界(沿 u 方向) </td></tr>
<tr><td class="paramname">curve_u1</td><td>v=1 处边界(沿 u 方向) </td></tr>
<tr><td class="paramname">curve_v0</td><td>u=0 处边界(沿 v 方向) </td></tr>
<tr><td class="paramname">curve_v1</td><td>u=1 处边界(沿 v 方向) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>Coons 曲面</dd></dl>
<dl class="section note"><dt>注解</dt><dd>仅保证边界插值,不保证内部形状与设计意图一致 <div class="fragment"><div class="line"><span class="keyword">auto</span> patch = <a class="code" href="group__curves.html#ga0e1b2c10581b040e266b5862f31b6740">coons_patch</a>(bottom, top, left, right);</div>
<div class="ttc" id="agroup__curves_html_ga0e1b2c10581b040e266b5862f31b6740"><div class="ttname"><a href="group__curves.html#ga0e1b2c10581b040e266b5862f31b6740">vde::curves::coons_patch</a></div><div class="ttdeci">NurbsSurface coons_patch(const NurbsCurve &amp;curve_u0, const NurbsCurve &amp;curve_u1, const NurbsCurve &amp;curve_v0, const NurbsCurve &amp;curve_v1)</div><div class="ttdoc">由四条边界曲线创建 Coons 曲面</div></div>
</div><!-- fragment --> </dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="group__curves.html#ga7580a509f2049a0154a695c641a59c5a" title="两 NURBS 曲线间的直纹面">ruled_surface</a> </dd></dl>
</div>
</div>
<a id="ga04aae3cd810d0e289e61b699b04113c6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga04aae3cd810d0e289e61b699b04113c6">&#9670;&nbsp;</a></span>extract_boundary_curve()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> vde::curves::extract_boundary_curve </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;&#160;</td>
<td class="paramname"><em>surf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>edge</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>提取 NURBS 曲面的等参边界曲线 </p>
<p>沿曲面的 u/v 参数极值提取边界 NURBS 曲线。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">surf</td><td>输入曲面 </td></tr>
<tr><td class="paramname">edge</td><td>边界索引:0=u_min, 1=u_max, 2=v_min, 3=v_max </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>指定边界上的 NURBS 曲线</dd></dl>
<dl class="section note"><dt>注解</dt><dd>边界曲线继承原曲面该方向的阶次和节点向量 <div class="fragment"><div class="line"><span class="keyword">auto</span> umin_curve = <a class="code" href="group__curves.html#ga04aae3cd810d0e289e61b699b04113c6">extract_boundary_curve</a>(surf, 0);</div>
<div class="line"><span class="keyword">auto</span> vmax_curve = <a class="code" href="group__curves.html#ga04aae3cd810d0e289e61b699b04113c6">extract_boundary_curve</a>(surf, 3);</div>
<div class="ttc" id="agroup__curves_html_ga04aae3cd810d0e289e61b699b04113c6"><div class="ttname"><a href="group__curves.html#ga04aae3cd810d0e289e61b699b04113c6">vde::curves::extract_boundary_curve</a></div><div class="ttdeci">NurbsCurve extract_boundary_curve(const NurbsSurface &amp;surf, int edge)</div><div class="ttdoc">提取 NURBS 曲面的等参边界曲线</div></div>
</div><!-- fragment --> </dd></dl>
</div>
</div>
<a id="ga4cab0f3ff296fdc05053eacac91f871f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4cab0f3ff296fdc05053eacac91f871f">&#9670;&nbsp;</a></span>extrude_curve()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> vde::curves::extrude_curve </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;&#160;</td>
<td class="paramname"><em>curve</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const Vector3D &amp;&#160;</td>
<td class="paramname"><em>direction</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>length</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>沿方向向量拉伸 NURBS 曲线为曲面 </p>
<p>创建阶次 (d)×1 的 NURBS 曲面(d = 曲线阶次)。 第一排控制点 = 曲线控制点,最后一排 = 偏移后的控制点。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">curve</td><td>截面曲线 </td></tr>
<tr><td class="paramname">direction</td><td>拉伸方向(内部归一化) </td></tr>
<tr><td class="paramname">length</td><td>拉伸长度 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>拉伸 NURBS 曲面</dd></dl>
<div class="fragment"><div class="line"><span class="keyword">auto</span> surface = <a class="code" href="group__curves.html#ga4cab0f3ff296fdc05053eacac91f871f">extrude_curve</a>(profile, {0, 0, 1}, 10.0);</div>
<div class="line"><span class="comment">// 沿 Z 轴拉伸 10 单位</span></div>
<div class="ttc" id="agroup__curves_html_ga4cab0f3ff296fdc05053eacac91f871f"><div class="ttname"><a href="group__curves.html#ga4cab0f3ff296fdc05053eacac91f871f">vde::curves::extrude_curve</a></div><div class="ttdeci">NurbsSurface extrude_curve(const NurbsCurve &amp;curve, const Vector3D &amp;direction, double length)</div><div class="ttdoc">沿方向向量拉伸 NURBS 曲线为曲面</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="gabfdf74f116bf265b378972b6a2081018"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gabfdf74f116bf265b378972b6a2081018">&#9670;&nbsp;</a></span>offset_surface()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> vde::curves::offset_surface </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;&#160;</td>
<td class="paramname"><em>surf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>distance</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>NURBS 曲面等距偏移 </p>
<p>基于 Piegl &amp; Tiller 近似方法:在每个控制点的 Greville 横坐标处 计算曲面法向,将控制点沿法向平移 distance。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">surf</td><td>输入 NURBS 曲面 </td></tr>
<tr><td class="paramname">distance</td><td>偏移距离(正值 = 沿法向外,负值 = 向内) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>偏移后的 NURBS 曲面(近似,阶次与原曲面相同)</dd></dl>
<dl class="section note"><dt>注解</dt><dd>这是几何近似,非精确偏移。对于大变曲率曲面,增大控制点数量 可提高精度。精确偏移需要更高阶曲面或细分方法。 </dd>
<dd>
偏移可能导致自交(distance 超过曲面局部曲率半径时) </dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="group__curves.html#gafdf84393ce3a052eb842dca1e1b5ecc7" title="NURBS 曲面参数域裁剪">trim_surface</a> <a class="el" href="group__curves.html#gad3cc80681a4081099a7527e524fa0bbd" title="两 NURBS 曲面沿边界边的过渡面">blend_surfaces</a> </dd></dl>
</div>
</div>
<a id="ga7580a509f2049a0154a695c641a59c5a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga7580a509f2049a0154a695c641a59c5a">&#9670;&nbsp;</a></span>ruled_surface()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> vde::curves::ruled_surface </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;&#160;</td>
<td class="paramname"><em>curve_a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsCurve.html">NurbsCurve</a> &amp;&#160;</td>
<td class="paramname"><em>curve_b</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>两 NURBS 曲线间的直纹面 </p>
<p>在两条曲线之间线性插值生成曲面: S(u,v) = (1-v)·C_a(u) + v·C_b(u) 纵向保持输入曲线的阶次,直纹方向为线性(degree=1)。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">curve_a</td><td>第一条曲线(v=0 边界) </td></tr>
<tr><td class="paramname">curve_b</td><td>第二条曲线(v=1 边界) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>直纹 NURBS 曲面</dd></dl>
<dl class="section note"><dt>注解</dt><dd>两条曲线需有兼容的阶次和节点结构(内部执行升阶和节点精化) <div class="fragment"><div class="line"><span class="keyword">auto</span> ruled = <a class="code" href="group__curves.html#ga7580a509f2049a0154a695c641a59c5a">ruled_surface</a>(profile_bottom, profile_top);</div>
<div class="ttc" id="agroup__curves_html_ga7580a509f2049a0154a695c641a59c5a"><div class="ttname"><a href="group__curves.html#ga7580a509f2049a0154a695c641a59c5a">vde::curves::ruled_surface</a></div><div class="ttdeci">NurbsSurface ruled_surface(const NurbsCurve &amp;curve_a, const NurbsCurve &amp;curve_b)</div><div class="ttdoc">两 NURBS 曲线间的直纹面</div></div>
</div><!-- fragment --> </dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="group__curves.html#ga0e1b2c10581b040e266b5862f31b6740" title="由四条边界曲线创建 Coons 曲面">coons_patch</a> <a class="el" href="group__curves.html#gad3cc80681a4081099a7527e524fa0bbd" title="两 NURBS 曲面沿边界边的过渡面">blend_surfaces</a> </dd></dl>
</div>
</div>
<a id="gaa17077923ccc4097a7dc783238c93c14"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa17077923ccc4097a7dc783238c93c14">&#9670;&nbsp;</a></span>tessellate()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::pair&lt;std::vector&lt;Point3D&gt;, std::vector&lt;std::array&lt;int, 3&gt; &gt; &gt; vde::curves::tessellate </td>
<td>(</td>
<td class="paramtype">const std::function&lt; Point3D(double, double)&gt; &amp;&#160;</td>
<td class="paramname"><em>eval</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>res_u</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>res_v</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>均匀参数化曲面三角化 </p>
<p>在参数域 [0,1]×[0,1] 上生成 res_u×res_v 均匀采样点, 调用 eval(u,v) 求值后将每个四边形拆为两个三角形。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">eval</td><td>曲面求值函数 eval(u,v) -&gt; Point3D,参数 (u,v) ∈ [0,1]×[0,1] </td></tr>
<tr><td class="paramname">res_u</td><td>u 方向子分段数(≥ 1 </td></tr>
<tr><td class="paramname">res_v</td><td>v 方向子分段数(≥ 1 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>{顶点数组, 三角形索引数组},三角形为 {i0,i1,i2}</dd></dl>
<dl class="section note"><dt>注解</dt><dd>总顶点数 = (res_u+1)×(res_v+1),三角形数 = 2×res_u×res_v <div class="fragment"><div class="line"><span class="keyword">auto</span> [verts, tris] = <a class="code" href="group__curves.html#gaa17077923ccc4097a7dc783238c93c14">tessellate</a>(</div>
<div class="line"> [&amp;](<span class="keywordtype">double</span> u, <span class="keywordtype">double</span> v) { <span class="keywordflow">return</span> surface.evaluate(u,v); },</div>
<div class="line"> 20, 20);</div>
<div class="ttc" id="agroup__curves_html_gaa17077923ccc4097a7dc783238c93c14"><div class="ttname"><a href="group__curves.html#gaa17077923ccc4097a7dc783238c93c14">vde::curves::tessellate</a></div><div class="ttdeci">std::pair&lt; std::vector&lt; Point3D &gt;, std::vector&lt; std::array&lt; int, 3 &gt; &gt; &gt; tessellate(const std::function&lt; Point3D(double, double)&gt; &amp;eval, int res_u, int res_v)</div><div class="ttdoc">均匀参数化曲面三角化</div></div>
</div><!-- fragment --> </dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="group__curves.html#gad5446ff8b077aecdad4ed145ccc681b8" title="自适应曲面三角化">adaptive_tessellate</a> </dd></dl>
</div>
</div>
<a id="gafdf84393ce3a052eb842dca1e1b5ecc7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gafdf84393ce3a052eb842dca1e1b5ecc7">&#9670;&nbsp;</a></span>trim_surface()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> vde::curves::trim_surface </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1curves_1_1NurbsSurface.html">NurbsSurface</a> &amp;&#160;</td>
<td class="paramname"><em>surf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>u_min</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>u_max</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>v_min</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>v_max</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>NURBS 曲面参数域裁剪 </p>
<p>将原始定义域 [u_min,u_max]×[v_min,v_max] 通过节点重参数化 映射到 [0,1]×[0,1],不改变控制点和权重——仅缩放平移节点向量, 曲面几何保持不变。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">surf</td><td>输入曲面 </td></tr>
<tr><td class="paramname">u_min,u_max</td><td>裁剪后的 u 参数范围(必须在原 domain 内) </td></tr>
<tr><td class="paramname">v_min,v_max</td><td>裁剪后的 v 参数范围(必须在原 domain 内) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>裁剪后的 NURBS 曲面</dd></dl>
<dl class="section note"><dt>注解</dt><dd>裁剪是"软裁剪"——几何不变,仅改变参数化。如需"硬裁剪" (沿等参线切除曲面边缘),需结合曲面细分。 <div class="fragment"><div class="line"><span class="keyword">auto</span> trimmed = <a class="code" href="group__curves.html#gafdf84393ce3a052eb842dca1e1b5ecc7">trim_surface</a>(surf, 0.2, 0.8, 0.1, 0.9);</div>
<div class="line"><span class="comment">// trimmed 的参数域为 [0,1]×[0,1],但几何仅对应原曲面的子区域</span></div>
<div class="ttc" id="agroup__curves_html_gafdf84393ce3a052eb842dca1e1b5ecc7"><div class="ttname"><a href="group__curves.html#gafdf84393ce3a052eb842dca1e1b5ecc7">vde::curves::trim_surface</a></div><div class="ttdeci">NurbsSurface trim_surface(const NurbsSurface &amp;surf, double u_min, double u_max, double v_min, double v_max)</div><div class="ttdoc">NURBS 曲面参数域裁剪</div></div>
</div><!-- fragment --> </dd></dl>
</div>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">生成于 2026年 七月 24日 星期五 11:21:23 , 为 ViewDesignEngine使用 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </li>
</ul>
</div>
</body>
</html>