Files
ViewDesignEngine/docs/api/sdf__optimize_8h_source.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

282 lines
50 KiB
HTML

<!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: include/vde/sdf/sdf_optimize.h 源文件</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('sdf__optimize_8h_source.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="headertitle">
<div class="title">sdf_optimize.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="sdf__optimize_8h.html">浏览该文件的文档.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span>&#160;<span class="preprocessor">#pragma once</span></div>
<div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="sdf__tree_8h.html">vde/sdf/sdf_tree.h</a>&quot;</span></div>
<div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="point_8h.html">vde/core/point.h</a>&quot;</span></div>
<div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160;<span class="preprocessor">#include &lt;vector&gt;</span></div>
<div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &lt;functional&gt;</span></div>
<div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160; </div>
<div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacevde_1_1sdf.html">vde::sdf</a> {</div>
<div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160; </div>
<div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">using</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">core::Point3D</a>;</div>
<div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;<span class="keyword">using</span> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">core::Vector3D</a>;</div>
<div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160; </div>
<div class="line"><a name="l00041"></a><span class="lineno"> 41</span>&#160;<span class="comment">// ────────────────────────────────────────────────</span></div>
<div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<span class="comment">// Shape Optimization</span></div>
<div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<span class="comment">// ────────────────────────────────────────────────</span></div>
<div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; </div>
<div class="line"><a name="l00050"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1OptimizeResult.html"> 50</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structvde_1_1sdf_1_1OptimizeResult.html">OptimizeResult</a> {</div>
<div class="line"><a name="l00051"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1OptimizeResult.html#aa28eb8fdf31493d2f294e03401085404"> 51</a></span>&#160; <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a> <a class="code" href="structvde_1_1sdf_1_1OptimizeResult.html#aa28eb8fdf31493d2f294e03401085404">optimized_shape</a>; </div>
<div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1OptimizeResult.html#afa8ff8ccb303c25d39942692b5dc074f"> 52</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structvde_1_1sdf_1_1OptimizeResult.html#afa8ff8ccb303c25d39942692b5dc074f">final_loss</a>; </div>
<div class="line"><a name="l00053"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1OptimizeResult.html#a4c5a8ca85fc30a4b9b5bfe945b73d9a1"> 53</a></span>&#160; <span class="keywordtype">int</span> <a class="code" href="structvde_1_1sdf_1_1OptimizeResult.html#a4c5a8ca85fc30a4b9b5bfe945b73d9a1">iterations</a>; </div>
<div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1OptimizeResult.html#a164285a2d84d09ab13e7e7f969956b80"> 54</a></span>&#160; <span class="keywordtype">bool</span> <a class="code" href="structvde_1_1sdf_1_1OptimizeResult.html#a164285a2d84d09ab13e7e7f969956b80">converged</a>; </div>
<div class="line"><a name="l00055"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1OptimizeResult.html#ad763278c553a7c69487340598f9bae0b"> 55</a></span>&#160; std::vector&lt;double&gt; <a class="code" href="structvde_1_1sdf_1_1OptimizeResult.html#ad763278c553a7c69487340598f9bae0b">loss_history</a>; </div>
<div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;};</div>
<div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; </div>
<div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a3ff132fb69c033909652b3078f81ad1a"> 65</a></span>&#160;<span class="keyword">using</span> <a class="code" href="namespacevde_1_1sdf.html#a3ff132fb69c033909652b3078f81ad1a">LossFn</a> = std::function&lt;double(<span class="keyword">const</span> std::function&lt;<span class="keywordtype">double</span>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp;)&gt;&amp;)&gt;;</div>
<div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; </div>
<div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;<span class="comment">// ── Shape Fitting ───────────────────────────────</span></div>
<div class="line"><a name="l00068"></a><span class="lineno"> 68</span>&#160; </div>
<div class="line"><a name="l00099"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a437e4e366b2cc67090426ce6b6158be6"> 99</a></span>&#160;[[nodiscard]] <a class="code" href="structvde_1_1sdf_1_1OptimizeResult.html">OptimizeResult</a> <a class="code" href="namespacevde_1_1sdf.html#a437e4e366b2cc67090426ce6b6158be6">fit_to_point_cloud</a>(</div>
<div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; initial,</div>
<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; <span class="keyword">const</span> std::vector&lt;Point3D&gt;&amp; target_points,</div>
<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="keywordtype">double</span> learning_rate = 0.01,</div>
<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <span class="keywordtype">int</span> max_iterations = 100);</div>
<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; </div>
<div class="line"><a name="l00119"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a268271fb51fd0a95c5b0611394397a9d"> 119</a></span>&#160;[[nodiscard]] <a class="code" href="structvde_1_1sdf_1_1OptimizeResult.html">OptimizeResult</a> <a class="code" href="namespacevde_1_1sdf.html#a268271fb51fd0a95c5b0611394397a9d">fit_surface_to_points</a>(</div>
<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; initial,</div>
<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; <span class="keyword">const</span> std::vector&lt;Point3D&gt;&amp; surface_points,</div>
<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <span class="keywordtype">double</span> learning_rate = 0.01,</div>
<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>&#160; <span class="keywordtype">int</span> max_iterations = 100);</div>
<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; </div>
<div class="line"><a name="l00147"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a5cf5230813be28ae6862f124adf3e438"> 147</a></span>&#160;[[nodiscard]] <a class="code" href="structvde_1_1sdf_1_1OptimizeResult.html">OptimizeResult</a> <a class="code" href="namespacevde_1_1sdf.html#a5cf5230813be28ae6862f124adf3e438">fit_to_sdf</a>(</div>
<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; source,</div>
<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <span class="keyword">const</span> std::function&lt;<span class="keywordtype">double</span>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp;)&gt;&amp; target_sdf,</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmin, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmax,</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keywordtype">int</span> grid_resolution = 16,</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordtype">double</span> learning_rate = 0.01,</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160; <span class="keywordtype">int</span> max_iterations = 100);</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160;<span class="comment">// ── Collision Avoidance ─────────────────────────</span></div>
<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; </div>
<div class="line"><a name="l00177"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a694dea06d4bbecf6063203f554d9fe05"> 177</a></span>&#160;[[nodiscard]] <span class="keywordtype">bool</span> <a class="code" href="namespacevde_1_1sdf.html#a694dea06d4bbecf6063203f554d9fe05">resolve_collision</a>(</div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape_a, <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape_b,</div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <span class="keywordtype">double</span> step_size = 0.1,</div>
<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <span class="keywordtype">int</span> max_iterations = 50);</div>
<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160; </div>
<div class="line"><a name="l00197"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a859ced3d37ab1c3b26dba3400fbb2dfc"> 197</a></span>&#160;[[nodiscard]] <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#a859ced3d37ab1c3b26dba3400fbb2dfc">penetration_depth</a>(</div>
<div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape_a,</div>
<div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape_b,</div>
<div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmin, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmax,</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keywordtype">int</span> samples = 1000);</div>
<div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; </div>
<div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160;<span class="comment">// ── Reachability / Accessibility ─────────────────</span></div>
<div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; </div>
<div class="line"><a name="l00221"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a2008f513c59b2b1d55cf7dd6ca7d5bcc"> 221</a></span>&#160;[[nodiscard]] <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#a2008f513c59b2b1d55cf7dd6ca7d5bcc">accessibility</a>(</div>
<div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape,</div>
<div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="comment">// surface point</span></div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>&amp; direction, <span class="comment">// approach direction</span></div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordtype">int</span> hemisphere_samples = 64);</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; </div>
<div class="line"><a name="l00241"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a145b3e2651a90dd1ddc4c5f8d2f3befd"> 241</a></span>&#160;[[nodiscard]] <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#a145b3e2651a90dd1ddc4c5f8d2f3befd">find_accessible_point</a>(</div>
<div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape,</div>
<div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>&amp; approach_dir,</div>
<div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmin, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmax,</div>
<div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; <span class="keywordtype">int</span> grid_res = 32);</div>
<div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; </div>
<div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160;<span class="comment">// ── Symmetry Detection ──────────────────────────</span></div>
<div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; </div>
<div class="line"><a name="l00265"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a6e1454146ae724f12fac47f7026048f7"> 265</a></span>&#160;[[nodiscard]] <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#a6e1454146ae724f12fac47f7026048f7">symmetry_score</a>(</div>
<div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape,</div>
<div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmin, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmax,</div>
<div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>&amp; plane_normal,</div>
<div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordtype">double</span> plane_offset = 0.0,</div>
<div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keywordtype">int</span> samples = 1000);</div>
<div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; </div>
<div class="line"><a name="l00275"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1SymmetryResult.html"> 275</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structvde_1_1sdf_1_1SymmetryResult.html">SymmetryResult</a> {</div>
<div class="line"><a name="l00276"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1SymmetryResult.html#a728d551540721a7aa5c65baeb6d87a8a"> 276</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structvde_1_1sdf_1_1SymmetryResult.html#a728d551540721a7aa5c65baeb6d87a8a">score</a>; </div>
<div class="line"><a name="l00277"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1SymmetryResult.html#ac6a7e9e46b44b9de5b2dc52f06da9a75"> 277</a></span>&#160; <a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a> <a class="code" href="structvde_1_1sdf_1_1SymmetryResult.html#ac6a7e9e46b44b9de5b2dc52f06da9a75">normal</a>; </div>
<div class="line"><a name="l00278"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1SymmetryResult.html#af1175d4979bb192167bd6aa95d69e610"> 278</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="structvde_1_1sdf_1_1SymmetryResult.html#af1175d4979bb192167bd6aa95d69e610">offset</a>; </div>
<div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160;};</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; </div>
<div class="line"><a name="l00295"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a03924b38a765ff02af4d2f7f97fa414b"> 295</a></span>&#160;[[nodiscard]] <a class="code" href="structvde_1_1sdf_1_1SymmetryResult.html">SymmetryResult</a> <a class="code" href="namespacevde_1_1sdf.html#a03924b38a765ff02af4d2f7f97fa414b">find_symmetry_plane</a>(</div>
<div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape,</div>
<div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmin, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmax,</div>
<div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; <span class="keywordtype">int</span> samples = 1000);</div>
<div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; </div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;<span class="comment">// ── SDF Volume Computation ──────────────────────</span></div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160; </div>
<div class="line"><a name="l00321"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#aa2c04cbe9e7cdd1252128f51af322a33"> 321</a></span>&#160;[[nodiscard]] <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#aa2c04cbe9e7cdd1252128f51af322a33">estimate_volume</a>(</div>
<div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape,</div>
<div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmin, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmax,</div>
<div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordtype">int</span> samples = 10000);</div>
<div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; </div>
<div class="line"><a name="l00341"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a2f05df8be69025eaa31529072fd47a6d"> 341</a></span>&#160;[[nodiscard]] <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#a2f05df8be69025eaa31529072fd47a6d">center_of_mass</a>(</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; shape,</div>
<div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmin, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; bmax,</div>
<div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordtype">int</span> samples = 10000);</div>
<div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; </div>
<div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160;<span class="comment">// ── Parameter Collection ────────────────────────</span></div>
<div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; </div>
<div class="line"><a name="l00354"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1ParamRef.html"> 354</a></span>&#160;<span class="keyword">struct </span><a class="code" href="structvde_1_1sdf_1_1ParamRef.html">ParamRef</a> {</div>
<div class="line"><a name="l00355"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1ParamRef.html#ae7bafe6272b37e49dbd27bb7801a17f7"> 355</a></span>&#160; <span class="keywordtype">double</span>* <a class="code" href="structvde_1_1sdf_1_1ParamRef.html#ae7bafe6272b37e49dbd27bb7801a17f7">value</a>; </div>
<div class="line"><a name="l00356"></a><span class="lineno"><a class="line" href="structvde_1_1sdf_1_1ParamRef.html#a0cbedc43e468666e27a8990f39f386d0"> 356</a></span>&#160; std::string <a class="code" href="structvde_1_1sdf_1_1ParamRef.html#a0cbedc43e468666e27a8990f39f386d0">name</a>; </div>
<div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160;};</div>
<div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; </div>
<div class="line"><a name="l00380"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#ad6473a81281335b9b3aff1f1f145c448"> 380</a></span>&#160;[[nodiscard]] std::vector&lt;ParamRef&gt; <a class="code" href="namespacevde_1_1sdf.html#ad6473a81281335b9b3aff1f1f145c448">collect_params</a>(<a class="code" href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">SdfNodePtr</a>&amp; root);</div>
<div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; </div>
<div class="line"><a name="l00405"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#afdc3f3bcc8bf4b4884210afadb494c72"> 405</a></span>&#160;[[nodiscard]] std::vector&lt;double&gt; <a class="code" href="namespacevde_1_1sdf.html#afdc3f3bcc8bf4b4884210afadb494c72">numerical_gradient</a>(</div>
<div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <span class="keyword">const</span> std::vector&lt;ParamRef&gt;&amp; params,</div>
<div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keyword">const</span> std::function&lt;<span class="keywordtype">double</span>()&gt;&amp; loss_fn,</div>
<div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordtype">double</span> eps = 1e-6);</div>
<div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; </div>
<div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160;<span class="comment">// ── Gradient Descent Utility ────────────────────</span></div>
<div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; </div>
<div class="line"><a name="l00428"></a><span class="lineno"><a class="line" href="classvde_1_1sdf_1_1GradientDescent.html"> 428</a></span>&#160;<span class="keyword">class </span><a class="code" href="classvde_1_1sdf_1_1GradientDescent.html">GradientDescent</a> {</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160;<span class="keyword">public</span>:</div>
<div class="line"><a name="l00434"></a><span class="lineno"><a class="line" href="classvde_1_1sdf_1_1GradientDescent.html#a3278d73a572d2439849e704278fe288e"> 434</a></span>&#160; <span class="keyword">explicit</span> <a class="code" href="classvde_1_1sdf_1_1GradientDescent.html#a3278d73a572d2439849e704278fe288e">GradientDescent</a>(<span class="keywordtype">double</span> lr) : lr_(lr) {}</div>
<div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; </div>
<div class="line"><a name="l00448"></a><span class="lineno"><a class="line" href="classvde_1_1sdf_1_1GradientDescent.html#ad2b8fd13bd3621248f58b96ad203cf20"> 448</a></span>&#160; <span class="keywordtype">double</span> <a class="code" href="classvde_1_1sdf_1_1GradientDescent.html#ad2b8fd13bd3621248f58b96ad203cf20">step</a>(std::vector&lt;double&gt;&amp; params,</div>
<div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keyword">const</span> std::function&lt;<span class="keywordtype">double</span>(<span class="keyword">const</span> std::vector&lt;double&gt;&amp;,</div>
<div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; std::vector&lt;double&gt;&amp;)&gt;&amp; grad_fn);</div>
<div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; </div>
<div class="line"><a name="l00453"></a><span class="lineno"><a class="line" href="classvde_1_1sdf_1_1GradientDescent.html#a60a9114d4dc5df50682390ab1747615d"> 453</a></span>&#160; <span class="keywordtype">void</span> <a class="code" href="classvde_1_1sdf_1_1GradientDescent.html#a60a9114d4dc5df50682390ab1747615d">set_learning_rate</a>(<span class="keywordtype">double</span> lr) { lr_ = lr; }</div>
<div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; </div>
<div class="line"><a name="l00456"></a><span class="lineno"><a class="line" href="classvde_1_1sdf_1_1GradientDescent.html#a733ab9edb64d4013c59d48940eef202a"> 456</a></span>&#160; [[nodiscard]] <span class="keywordtype">double</span> <a class="code" href="classvde_1_1sdf_1_1GradientDescent.html#a733ab9edb64d4013c59d48940eef202a">learning_rate</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> lr_; }</div>
<div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; </div>
<div class="line"><a name="l00459"></a><span class="lineno"><a class="line" href="classvde_1_1sdf_1_1GradientDescent.html#a1691b2a9296d4c0e2dc6a86c57d5620e"> 459</a></span>&#160; [[nodiscard]] <span class="keywordtype">int</span> <a class="code" href="classvde_1_1sdf_1_1GradientDescent.html#a1691b2a9296d4c0e2dc6a86c57d5620e">iteration</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> iteration_; }</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; </div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160;<span class="keyword">private</span>:</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="keywordtype">double</span> lr_;</div>
<div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keywordtype">int</span> iteration_ = 0;</div>
<div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160;};</div>
<div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; </div>
<div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160;} <span class="comment">// namespace vde::sdf</span></div>
<div class="ttc" id="aclassvde_1_1sdf_1_1GradientDescent_html"><div class="ttname"><a href="classvde_1_1sdf_1_1GradientDescent.html">vde::sdf::GradientDescent</a></div><div class="ttdoc">固定学习率的简单梯度下降优化器</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00428">sdf_optimize.h:428</a></div></div>
<div class="ttc" id="aclassvde_1_1sdf_1_1GradientDescent_html_a1691b2a9296d4c0e2dc6a86c57d5620e"><div class="ttname"><a href="classvde_1_1sdf_1_1GradientDescent.html#a1691b2a9296d4c0e2dc6a86c57d5620e">vde::sdf::GradientDescent::iteration</a></div><div class="ttdeci">int iteration() const</div><div class="ttdoc">获取当前迭代次数</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00459">sdf_optimize.h:459</a></div></div>
<div class="ttc" id="aclassvde_1_1sdf_1_1GradientDescent_html_a3278d73a572d2439849e704278fe288e"><div class="ttname"><a href="classvde_1_1sdf_1_1GradientDescent.html#a3278d73a572d2439849e704278fe288e">vde::sdf::GradientDescent::GradientDescent</a></div><div class="ttdeci">GradientDescent(double lr)</div><div class="ttdoc">构造优化器</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00434">sdf_optimize.h:434</a></div></div>
<div class="ttc" id="aclassvde_1_1sdf_1_1GradientDescent_html_a60a9114d4dc5df50682390ab1747615d"><div class="ttname"><a href="classvde_1_1sdf_1_1GradientDescent.html#a60a9114d4dc5df50682390ab1747615d">vde::sdf::GradientDescent::set_learning_rate</a></div><div class="ttdeci">void set_learning_rate(double lr)</div><div class="ttdoc">设置学习率</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00453">sdf_optimize.h:453</a></div></div>
<div class="ttc" id="aclassvde_1_1sdf_1_1GradientDescent_html_a733ab9edb64d4013c59d48940eef202a"><div class="ttname"><a href="classvde_1_1sdf_1_1GradientDescent.html#a733ab9edb64d4013c59d48940eef202a">vde::sdf::GradientDescent::learning_rate</a></div><div class="ttdeci">double learning_rate() const</div><div class="ttdoc">获取学习率</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00456">sdf_optimize.h:456</a></div></div>
<div class="ttc" id="aclassvde_1_1sdf_1_1GradientDescent_html_ad2b8fd13bd3621248f58b96ad203cf20"><div class="ttname"><a href="classvde_1_1sdf_1_1GradientDescent.html#ad2b8fd13bd3621248f58b96ad203cf20">vde::sdf::GradientDescent::step</a></div><div class="ttdeci">double step(std::vector&lt; double &gt; &amp;params, const std::function&lt; double(const std::vector&lt; double &gt; &amp;, std::vector&lt; double &gt; &amp;)&gt; &amp;grad_fn)</div><div class="ttdoc">执行单步梯度下降</div></div>
<div class="ttc" id="anamespacevde_1_1core_html_ab763c018d19e10e91a6c6d6ab2ccc8e0"><div class="ttname"><a href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">vde::core::Vector3D</a></div><div class="ttdeci">foundation::Vector3D Vector3D</div><div class="ttdoc">双精度三维向量(重新导出)</div><div class="ttdef"><b>Definition:</b> <a href="point_8h_source.html#l00049">point.h:49</a></div></div>
<div class="ttc" id="anamespacevde_1_1core_html_ac6aed70c4b90d13f10217267cd7a1952"><div class="ttname"><a href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">vde::core::Point3D</a></div><div class="ttdeci">foundation::Point3D Point3D</div><div class="ttdoc">双精度三维点(重新导出)</div><div class="ttdef"><b>Definition:</b> <a href="point_8h_source.html#l00031">point.h:31</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html"><div class="ttname"><a href="namespacevde_1_1sdf.html">vde::sdf</a></div><div class="ttdef"><b>Definition:</b> <a href="sdf__gradient_8h_source.html#l00032">sdf_gradient.h:32</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a03924b38a765ff02af4d2f7f97fa414b"><div class="ttname"><a href="namespacevde_1_1sdf.html#a03924b38a765ff02af4d2f7f97fa414b">vde::sdf::find_symmetry_plane</a></div><div class="ttdeci">SymmetryResult find_symmetry_plane(const SdfNodePtr &amp;shape, const Point3D &amp;bmin, const Point3D &amp;bmax, int samples=1000)</div><div class="ttdoc">自动找到形状的最佳反射对称平面</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a145b3e2651a90dd1ddc4c5f8d2f3befd"><div class="ttname"><a href="namespacevde_1_1sdf.html#a145b3e2651a90dd1ddc4c5f8d2f3befd">vde::sdf::find_accessible_point</a></div><div class="ttdeci">Point3D find_accessible_point(const SdfNodePtr &amp;shape, const Vector3D &amp;approach_dir, const Point3D &amp;bmin, const Point3D &amp;bmax, int grid_res=32)</div><div class="ttdoc">找到给定接近方向下具有最大可及性的表面点</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a2008f513c59b2b1d55cf7dd6ca7d5bcc"><div class="ttname"><a href="namespacevde_1_1sdf.html#a2008f513c59b2b1d55cf7dd6ca7d5bcc">vde::sdf::accessibility</a></div><div class="ttdeci">double accessibility(const SdfNodePtr &amp;shape, const Point3D &amp;p, const Vector3D &amp;direction, int hemisphere_samples=64)</div><div class="ttdoc">计算形状表面上点的可及性分数</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a268271fb51fd0a95c5b0611394397a9d"><div class="ttname"><a href="namespacevde_1_1sdf.html#a268271fb51fd0a95c5b0611394397a9d">vde::sdf::fit_surface_to_points</a></div><div class="ttdeci">OptimizeResult fit_surface_to_points(const SdfNodePtr &amp;initial, const std::vector&lt; Point3D &gt; &amp;surface_points, double learning_rate=0.01, int max_iterations=100)</div><div class="ttdoc">将形状表面移动到目标采样点</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a2f05df8be69025eaa31529072fd47a6d"><div class="ttname"><a href="namespacevde_1_1sdf.html#a2f05df8be69025eaa31529072fd47a6d">vde::sdf::center_of_mass</a></div><div class="ttdeci">Point3D center_of_mass(const SdfNodePtr &amp;shape, const Point3D &amp;bmin, const Point3D &amp;bmax, int samples=10000)</div><div class="ttdoc">通过蒙地卡罗法估算形状的质心</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a3ff132fb69c033909652b3078f81ad1a"><div class="ttname"><a href="namespacevde_1_1sdf.html#a3ff132fb69c033909652b3078f81ad1a">vde::sdf::LossFn</a></div><div class="ttdeci">std::function&lt; double(const std::function&lt; double(const Point3D &amp;)&gt; &amp;)&gt; LossFn</div><div class="ttdoc">损失函数类型</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00065">sdf_optimize.h:65</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a437e4e366b2cc67090426ce6b6158be6"><div class="ttname"><a href="namespacevde_1_1sdf.html#a437e4e366b2cc67090426ce6b6158be6">vde::sdf::fit_to_point_cloud</a></div><div class="ttdeci">OptimizeResult fit_to_point_cloud(const SdfNodePtr &amp;initial, const std::vector&lt; Point3D &gt; &amp;target_points, double learning_rate=0.01, int max_iterations=100)</div><div class="ttdoc">将参数化形状拟合到目标点云</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a5cf5230813be28ae6862f124adf3e438"><div class="ttname"><a href="namespacevde_1_1sdf.html#a5cf5230813be28ae6862f124adf3e438">vde::sdf::fit_to_sdf</a></div><div class="ttdeci">OptimizeResult fit_to_sdf(const SdfNodePtr &amp;source, const std::function&lt; double(const Point3D &amp;)&gt; &amp;target_sdf, const Point3D &amp;bmin, const Point3D &amp;bmax, int grid_resolution=16, double learning_rate=0.01, int max_iterations=100)</div><div class="ttdoc">拟合一个 SDF 形状以匹配另一个目标 SDF</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a694dea06d4bbecf6063203f554d9fe05"><div class="ttname"><a href="namespacevde_1_1sdf.html#a694dea06d4bbecf6063203f554d9fe05">vde::sdf::resolve_collision</a></div><div class="ttdeci">bool resolve_collision(SdfNodePtr &amp;shape_a, SdfNodePtr &amp;shape_b, double step_size=0.1, int max_iterations=50)</div><div class="ttdoc">通过平移解决两个形状之间的穿透</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a6e1454146ae724f12fac47f7026048f7"><div class="ttname"><a href="namespacevde_1_1sdf.html#a6e1454146ae724f12fac47f7026048f7">vde::sdf::symmetry_score</a></div><div class="ttdeci">double symmetry_score(const SdfNodePtr &amp;shape, const Point3D &amp;bmin, const Point3D &amp;bmax, const Vector3D &amp;plane_normal, double plane_offset=0.0, int samples=1000)</div><div class="ttdoc">检测形状在给定方向上的反射对称性</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a859ced3d37ab1c3b26dba3400fbb2dfc"><div class="ttname"><a href="namespacevde_1_1sdf.html#a859ced3d37ab1c3b26dba3400fbb2dfc">vde::sdf::penetration_depth</a></div><div class="ttdeci">double penetration_depth(const SdfNodePtr &amp;shape_a, const SdfNodePtr &amp;shape_b, const Point3D &amp;bmin, const Point3D &amp;bmax, int samples=1000)</div><div class="ttdoc">估算两个形状之间的最小穿透距离</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a8fdcf277d6327c0b1413373ae82f9d5d"><div class="ttname"><a href="namespacevde_1_1sdf.html#a8fdcf277d6327c0b1413373ae82f9d5d">vde::sdf::SdfNodePtr</a></div><div class="ttdeci">std::shared_ptr&lt; SdfNode &gt; SdfNodePtr</div><div class="ttdef"><b>Definition:</b> <a href="sdf__tree_8h_source.html#l00048">sdf_tree.h:48</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_aa2c04cbe9e7cdd1252128f51af322a33"><div class="ttname"><a href="namespacevde_1_1sdf.html#aa2c04cbe9e7cdd1252128f51af322a33">vde::sdf::estimate_volume</a></div><div class="ttdeci">double estimate_volume(const SdfNodePtr &amp;shape, const Point3D &amp;bmin, const Point3D &amp;bmax, int samples=10000)</div><div class="ttdoc">通过蒙地卡罗法估算隐式形状的体积</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_ad6473a81281335b9b3aff1f1f145c448"><div class="ttname"><a href="namespacevde_1_1sdf.html#ad6473a81281335b9b3aff1f1f145c448">vde::sdf::collect_params</a></div><div class="ttdeci">std::vector&lt; ParamRef &gt; collect_params(SdfNodePtr &amp;root)</div><div class="ttdoc">从叶节点收集所有可变数值参数</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_afdc3f3bcc8bf4b4884210afadb494c72"><div class="ttname"><a href="namespacevde_1_1sdf.html#afdc3f3bcc8bf4b4884210afadb494c72">vde::sdf::numerical_gradient</a></div><div class="ttdeci">std::vector&lt; double &gt; numerical_gradient(const std::vector&lt; ParamRef &gt; &amp;params, const std::function&lt; double()&gt; &amp;loss_fn, double eps=1e-6)</div><div class="ttdoc">计算标量损失对收集到的参数的数值梯度</div></div>
<div class="ttc" id="apoint_8h_html"><div class="ttname"><a href="point_8h.html">point.h</a></div></div>
<div class="ttc" id="asdf__tree_8h_html"><div class="ttname"><a href="sdf__tree_8h.html">sdf_tree.h</a></div><div class="ttdoc">SDF 表达式树结构</div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1OptimizeResult_html"><div class="ttname"><a href="structvde_1_1sdf_1_1OptimizeResult.html">vde::sdf::OptimizeResult</a></div><div class="ttdoc">优化结果</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00050">sdf_optimize.h:50</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1OptimizeResult_html_a164285a2d84d09ab13e7e7f969956b80"><div class="ttname"><a href="structvde_1_1sdf_1_1OptimizeResult.html#a164285a2d84d09ab13e7e7f969956b80">vde::sdf::OptimizeResult::converged</a></div><div class="ttdeci">bool converged</div><div class="ttdoc">是否收敛</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00054">sdf_optimize.h:54</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1OptimizeResult_html_a4c5a8ca85fc30a4b9b5bfe945b73d9a1"><div class="ttname"><a href="structvde_1_1sdf_1_1OptimizeResult.html#a4c5a8ca85fc30a4b9b5bfe945b73d9a1">vde::sdf::OptimizeResult::iterations</a></div><div class="ttdeci">int iterations</div><div class="ttdoc">实际迭代次数</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00053">sdf_optimize.h:53</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1OptimizeResult_html_aa28eb8fdf31493d2f294e03401085404"><div class="ttname"><a href="structvde_1_1sdf_1_1OptimizeResult.html#aa28eb8fdf31493d2f294e03401085404">vde::sdf::OptimizeResult::optimized_shape</a></div><div class="ttdeci">SdfNodePtr optimized_shape</div><div class="ttdoc">优化后的 SDF 树(参数已更新)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00051">sdf_optimize.h:51</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1OptimizeResult_html_ad763278c553a7c69487340598f9bae0b"><div class="ttname"><a href="structvde_1_1sdf_1_1OptimizeResult.html#ad763278c553a7c69487340598f9bae0b">vde::sdf::OptimizeResult::loss_history</a></div><div class="ttdeci">std::vector&lt; double &gt; loss_history</div><div class="ttdoc">每次迭代的损失记录</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00055">sdf_optimize.h:55</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1OptimizeResult_html_afa8ff8ccb303c25d39942692b5dc074f"><div class="ttname"><a href="structvde_1_1sdf_1_1OptimizeResult.html#afa8ff8ccb303c25d39942692b5dc074f">vde::sdf::OptimizeResult::final_loss</a></div><div class="ttdeci">double final_loss</div><div class="ttdoc">最终损失值</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00052">sdf_optimize.h:52</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1ParamRef_html"><div class="ttname"><a href="structvde_1_1sdf_1_1ParamRef.html">vde::sdf::ParamRef</a></div><div class="ttdoc">SDF 树中可变参数的引用</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00354">sdf_optimize.h:354</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1ParamRef_html_a0cbedc43e468666e27a8990f39f386d0"><div class="ttname"><a href="structvde_1_1sdf_1_1ParamRef.html#a0cbedc43e468666e27a8990f39f386d0">vde::sdf::ParamRef::name</a></div><div class="ttdeci">std::string name</div><div class="ttdoc">参数名称(调试用)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00356">sdf_optimize.h:356</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1ParamRef_html_ae7bafe6272b37e49dbd27bb7801a17f7"><div class="ttname"><a href="structvde_1_1sdf_1_1ParamRef.html#ae7bafe6272b37e49dbd27bb7801a17f7">vde::sdf::ParamRef::value</a></div><div class="ttdeci">double * value</div><div class="ttdoc">指向参数值的可写指针</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00355">sdf_optimize.h:355</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1SymmetryResult_html"><div class="ttname"><a href="structvde_1_1sdf_1_1SymmetryResult.html">vde::sdf::SymmetryResult</a></div><div class="ttdoc">对称检测结果</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00275">sdf_optimize.h:275</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1SymmetryResult_html_a728d551540721a7aa5c65baeb6d87a8a"><div class="ttname"><a href="structvde_1_1sdf_1_1SymmetryResult.html#a728d551540721a7aa5c65baeb6d87a8a">vde::sdf::SymmetryResult::score</a></div><div class="ttdeci">double score</div><div class="ttdoc">对称性分数 [0, 1]</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00276">sdf_optimize.h:276</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1SymmetryResult_html_ac6a7e9e46b44b9de5b2dc52f06da9a75"><div class="ttname"><a href="structvde_1_1sdf_1_1SymmetryResult.html#ac6a7e9e46b44b9de5b2dc52f06da9a75">vde::sdf::SymmetryResult::normal</a></div><div class="ttdeci">Vector3D normal</div><div class="ttdoc">最佳对称平面的法向量</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00277">sdf_optimize.h:277</a></div></div>
<div class="ttc" id="astructvde_1_1sdf_1_1SymmetryResult_html_af1175d4979bb192167bd6aa95d69e610"><div class="ttname"><a href="structvde_1_1sdf_1_1SymmetryResult.html#af1175d4979bb192167bd6aa95d69e610">vde::sdf::SymmetryResult::offset</a></div><div class="ttdeci">double offset</div><div class="ttdoc">最佳对称平面的偏移量</div><div class="ttdef"><b>Definition:</b> <a href="sdf__optimize_8h_source.html#l00278">sdf_optimize.h:278</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li><li class="navelem"><a class="el" href="dir_36dfe8171299c47a6036082559f11ede.html">vde</a></li><li class="navelem"><a class="el" href="dir_865941a50ed007925fcdd14642daadc9.html">sdf</a></li><li class="navelem"><a class="el" href="sdf__optimize_8h.html">sdf_optimize.h</a></li>
<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>