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

250 lines
40 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: include/vde/sdf/sdf_operations.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__operations_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_operations.h</div> </div>
</div><!--header-->
<div class="contents">
<a href="sdf__operations_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="l00017"></a><span class="lineno"> 17</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="l00018"></a><span class="lineno"> 18</span>&#160;<span class="preprocessor">#include &lt;cmath&gt;</span></div>
<div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div>
<div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160; </div>
<div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacevde_1_1sdf.html">vde::sdf</a> {</div>
<div class="line"><a name="l00022"></a><span class="lineno"> 22</span>&#160; </div>
<div class="line"><a name="l00023"></a><span class="lineno"> 23</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="l00024"></a><span class="lineno"> 24</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="l00025"></a><span class="lineno"> 25</span>&#160; </div>
<div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment">// ── Boolean operations on distance values ──</span></div>
<div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160; </div>
<div class="line"><a name="l00048"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a93c4506583db122c5b657d39d6d2bb62"> 48</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#a93c4506583db122c5b657d39d6d2bb62">op_union</a>(<span class="keywordtype">double</span> d1, <span class="keywordtype">double</span> d2) {</div>
<div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <span class="keywordflow">return</span> std::min(d1, d2);</div>
<div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;}</div>
<div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; </div>
<div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a00a754cf7c486ad311e6c3221b9d56de"> 70</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#a00a754cf7c486ad311e6c3221b9d56de">op_intersection</a>(<span class="keywordtype">double</span> d1, <span class="keywordtype">double</span> d2) {</div>
<div class="line"><a name="l00071"></a><span class="lineno"> 71</span>&#160; <span class="keywordflow">return</span> std::max(d1, d2);</div>
<div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;}</div>
<div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; </div>
<div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a316369d0cdc7dafbe2af5dd6cb58955b"> 94</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#a316369d0cdc7dafbe2af5dd6cb58955b">op_difference</a>(<span class="keywordtype">double</span> d1, <span class="keywordtype">double</span> d2) {</div>
<div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160; <span class="keywordflow">return</span> std::max(d1, -d2);</div>
<div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;}</div>
<div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; </div>
<div class="line"><a name="l00126"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#af6c1da88edd1032340478a9d31fee04d"> 126</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#af6c1da88edd1032340478a9d31fee04d">op_smooth_union</a>(<span class="keywordtype">double</span> d1, <span class="keywordtype">double</span> d2, <span class="keywordtype">double</span> k) {</div>
<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>&#160; <span class="keywordflow">if</span> (k &lt;= 0.0) <span class="keywordflow">return</span> std::min(d1, d2);</div>
<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keywordtype">double</span> h = std::clamp(0.5 + 0.5 * (d1 - d2) / k, 0.0, 1.0);</div>
<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">return</span> d1 * (1.0 - h) + d2 * h - k * h * (1.0 - h);</div>
<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160;}</div>
<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; </div>
<div class="line"><a name="l00149"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#afdef99b133742cf60abd412240f86e21"> 149</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#afdef99b133742cf60abd412240f86e21">op_smooth_intersection</a>(<span class="keywordtype">double</span> d1, <span class="keywordtype">double</span> d2, <span class="keywordtype">double</span> k) {</div>
<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160; <span class="keywordflow">if</span> (k &lt;= 0.0) <span class="keywordflow">return</span> std::max(d1, d2);</div>
<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="keywordtype">double</span> h = std::clamp(0.5 - 0.5 * (d1 - d2) / k, 0.0, 1.0);</div>
<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <span class="keywordflow">return</span> d1 * (1.0 - h) + d2 * h + k * h * (1.0 - h);</div>
<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;}</div>
<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; </div>
<div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a943524bd6d441649f241702b484c5edb"> 172</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#a943524bd6d441649f241702b484c5edb">op_smooth_difference</a>(<span class="keywordtype">double</span> d1, <span class="keywordtype">double</span> d2, <span class="keywordtype">double</span> k) {</div>
<div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keywordflow">if</span> (k &lt;= 0.0) <span class="keywordflow">return</span> std::max(d1, -d2);</div>
<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160; <span class="keywordtype">double</span> h = std::clamp(0.5 - 0.5 * (d2 + d1) / k, 0.0, 1.0);</div>
<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <span class="keywordflow">return</span> d1 * (1.0 - h) + (-d2) * h + k * h * (1.0 - h);</div>
<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;}</div>
<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; </div>
<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160;<span class="comment">// ── Modifiers (operate on a distance value) ──</span></div>
<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; </div>
<div class="line"><a name="l00200"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#ae59893f12b9e88076f07164209208158"> 200</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#ae59893f12b9e88076f07164209208158">op_round</a>(<span class="keywordtype">double</span> d, <span class="keywordtype">double</span> r) {</div>
<div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="keywordflow">return</span> d - r;</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; </div>
<div class="line"><a name="l00223"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a563ec8e0c6486c28c572ccb5f594fa85"> 223</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#a563ec8e0c6486c28c572ccb5f594fa85">op_onion</a>(<span class="keywordtype">double</span> d, <span class="keywordtype">double</span> thickness) {</div>
<div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">return</span> std::abs(d) - thickness;</div>
<div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160;}</div>
<div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; </div>
<div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160;<span class="comment">// ── Domain deformation operators (transform point space) ──</span></div>
<div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; </div>
<div class="line"><a name="l00251"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a9355bc4b4ef7090f7bdcbe9843f8e1a7"> 251</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#a9355bc4b4ef7090f7bdcbe9843f8e1a7">op_repeat</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; cell) {</div>
<div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; <span class="keyword">auto</span> wrap = [](<span class="keywordtype">double</span> v, <span class="keywordtype">double</span> c) {</div>
<div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">return</span> c &gt; 0.0 ? v - c * std::round(v / c) : v;</div>
<div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160; };</div>
<div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(wrap(p.x(), cell.x()),</div>
<div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; wrap(p.y(), cell.y()),</div>
<div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; wrap(p.z(), cell.z()));</div>
<div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160;}</div>
<div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; </div>
<div class="line"><a name="l00279"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#ab58d71cf3656077b0fb628f67b904e37"> 279</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#ab58d71cf3656077b0fb628f67b904e37">op_mirror_x</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="keywordtype">double</span> offset = 0.0) {</div>
<div class="line"><a name="l00280"></a><span class="lineno"> 280</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(offset + std::abs(p.x() - offset), p.y(), p.z());</div>
<div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160;}</div>
<div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; </div>
<div class="line"><a name="l00299"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a6538e7ff0033a1a9288cc2d15f4a03a1"> 299</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#a6538e7ff0033a1a9288cc2d15f4a03a1">op_mirror_y</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p) {</div>
<div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(p.x(), std::abs(p.y()), p.z());</div>
<div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160;}</div>
<div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; </div>
<div class="line"><a name="l00313"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#aacbb86f73cd6f9c47e4fbbb4c13a9925"> 313</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#aacbb86f73cd6f9c47e4fbbb4c13a9925">op_mirror_z</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p) {</div>
<div class="line"><a name="l00314"></a><span class="lineno"> 314</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(p.x(), p.y(), std::abs(p.z()));</div>
<div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160;}</div>
<div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; </div>
<div class="line"><a name="l00339"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#abfa3300d4dfaab3011ff58140eee0f5e"> 339</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#abfa3300d4dfaab3011ff58140eee0f5e">op_translate</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; offset) {</div>
<div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; <span class="keywordflow">return</span> p - offset;</div>
<div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;}</div>
<div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; </div>
<div class="line"><a name="l00368"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a0a6712d3a66703859659125e494a9495"> 368</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#a0a6712d3a66703859659125e494a9495">op_rotate</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="keywordtype">double</span> angle_rad) {</div>
<div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; <span class="keywordtype">double</span> c = std::cos(-angle_rad);</div>
<div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <span class="keywordtype">double</span> s = std::sin(-angle_rad);</div>
<div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(p.x() * c - p.z() * s, p.y(), p.x() * s + p.z() * c);</div>
<div class="line"><a name="l00372"></a><span class="lineno"> 372</span>&#160;}</div>
<div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; </div>
<div class="line"><a name="l00397"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a19c90581792b7a18ec7d29abf01c0db4"> 397</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#a19c90581792b7a18ec7d29abf01c0db4">op_scale</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; s) {</div>
<div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(p.x() / s.x(), p.y() / s.y(), p.z() / s.z());</div>
<div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160;}</div>
<div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; </div>
<div class="line"><a name="l00426"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a31a4e410f7c183d57b1e934906c3a312"> 426</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#a31a4e410f7c183d57b1e934906c3a312">op_twist</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="keywordtype">double</span> amount) {</div>
<div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordtype">double</span> c = std::cos(amount * p.y());</div>
<div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160; <span class="keywordtype">double</span> s = std::sin(amount * p.y());</div>
<div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(p.x() * c - p.z() * s, p.y(), p.x() * s + p.z() * c);</div>
<div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160;}</div>
<div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; </div>
<div class="line"><a name="l00457"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a597742c134fb3ea329343f830a55d953"> 457</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#a597742c134fb3ea329343f830a55d953">op_bend</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="keywordtype">double</span> k) {</div>
<div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; <span class="keywordtype">double</span> c = std::cos(k * p.x());</div>
<div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keywordtype">double</span> s = std::sin(k * p.x());</div>
<div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(c * p.x() - s * p.y(), s * p.x() + c * p.y(), p.z());</div>
<div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160;}</div>
<div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; </div>
<div class="line"><a name="l00486"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#aa0da23488d5275d8185e452a449bd8c2"> 486</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#aa0da23488d5275d8185e452a449bd8c2">op_elongate</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; h) {</div>
<div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> q = p.cwiseAbs() - h;</div>
<div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(</div>
<div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; q.x() &gt; 0.0 ? p.x() - std::copysign(h.x(), p.x()) : 0.0,</div>
<div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; q.y() &gt; 0.0 ? p.y() - std::copysign(h.y(), p.y()) : 0.0,</div>
<div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; q.z() &gt; 0.0 ? p.z() - std::copysign(h.z(), p.z()) : 0.0</div>
<div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; );</div>
<div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160;}</div>
<div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; </div>
<div class="line"><a name="l00515"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#a4976ece321c496be9e3a4c90c1ebd064"> 515</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> <a class="code" href="namespacevde_1_1sdf.html#a4976ece321c496be9e3a4c90c1ebd064">op_cheap_bend</a>(<span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p, <span class="keywordtype">double</span> k) {</div>
<div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160; <span class="keywordtype">double</span> c = std::cos(k * p.x());</div>
<div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="keywordtype">double</span> s = std::sin(k * p.x());</div>
<div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keywordflow">return</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(p.x(), p.y() * c - p.z() * s, p.y() * s + p.z() * c);</div>
<div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160;}</div>
<div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; </div>
<div class="line"><a name="l00545"></a><span class="lineno"><a class="line" href="namespacevde_1_1sdf.html#acc0f043de0b30ecf426f17602de1a53a"> 545</a></span>&#160;[[nodiscard]] <span class="keyword">inline</span> <span class="keywordtype">double</span> <a class="code" href="namespacevde_1_1sdf.html#acc0f043de0b30ecf426f17602de1a53a">op_displace</a>(<span class="keywordtype">double</span> d, <span class="keyword">const</span> <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&amp; p,</div>
<div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keywordtype">double</span> amplitude, <span class="keywordtype">double</span> frequency) {</div>
<div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keywordtype">double</span> noise = std::sin(p.x() * frequency) *</div>
<div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; std::sin(p.y() * frequency) *</div>
<div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; std::sin(p.z() * frequency);</div>
<div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; <span class="keywordflow">return</span> d + amplitude * noise;</div>
<div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160;}</div>
<div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; </div>
<div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160;} <span class="comment">// namespace vde::sdf</span></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_a00a754cf7c486ad311e6c3221b9d56de"><div class="ttname"><a href="namespacevde_1_1sdf.html#a00a754cf7c486ad311e6c3221b9d56de">vde::sdf::op_intersection</a></div><div class="ttdeci">double op_intersection(double d1, double d2)</div><div class="ttdoc">布尔交集: A ∩ B</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00070">sdf_operations.h:70</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a0a6712d3a66703859659125e494a9495"><div class="ttname"><a href="namespacevde_1_1sdf.html#a0a6712d3a66703859659125e494a9495">vde::sdf::op_rotate</a></div><div class="ttdeci">Point3D op_rotate(const Point3D &amp;p, double angle_rad)</div><div class="ttdoc">绕 Y 轴旋转(逆变换)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00368">sdf_operations.h:368</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a19c90581792b7a18ec7d29abf01c0db4"><div class="ttname"><a href="namespacevde_1_1sdf.html#a19c90581792b7a18ec7d29abf01c0db4">vde::sdf::op_scale</a></div><div class="ttdeci">Point3D op_scale(const Point3D &amp;p, const Point3D &amp;s)</div><div class="ttdoc">非均匀缩放(逆变换)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00397">sdf_operations.h:397</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a316369d0cdc7dafbe2af5dd6cb58955b"><div class="ttname"><a href="namespacevde_1_1sdf.html#a316369d0cdc7dafbe2af5dd6cb58955b">vde::sdf::op_difference</a></div><div class="ttdeci">double op_difference(double d1, double d2)</div><div class="ttdoc">布尔差集: A \ B</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00094">sdf_operations.h:94</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a31a4e410f7c183d57b1e934906c3a312"><div class="ttname"><a href="namespacevde_1_1sdf.html#a31a4e410f7c183d57b1e934906c3a312">vde::sdf::op_twist</a></div><div class="ttdeci">Point3D op_twist(const Point3D &amp;p, double amount)</div><div class="ttdoc">绕 Y 轴的扭曲变换</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00426">sdf_operations.h:426</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a4976ece321c496be9e3a4c90c1ebd064"><div class="ttname"><a href="namespacevde_1_1sdf.html#a4976ece321c496be9e3a4c90c1ebd064">vde::sdf::op_cheap_bend</a></div><div class="ttdeci">Point3D op_cheap_bend(const Point3D &amp;p, double k)</div><div class="ttdoc">简化弯曲变换(绕 X 轴弯曲 YZ 平面)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00515">sdf_operations.h:515</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a563ec8e0c6486c28c572ccb5f594fa85"><div class="ttname"><a href="namespacevde_1_1sdf.html#a563ec8e0c6486c28c572ccb5f594fa85">vde::sdf::op_onion</a></div><div class="ttdeci">double op_onion(double d, double thickness)</div><div class="ttdoc">洋葱皮/壳层修饰: 取绝对值后减去厚度</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00223">sdf_operations.h:223</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a597742c134fb3ea329343f830a55d953"><div class="ttname"><a href="namespacevde_1_1sdf.html#a597742c134fb3ea329343f830a55d953">vde::sdf::op_bend</a></div><div class="ttdeci">Point3D op_bend(const Point3D &amp;p, double k)</div><div class="ttdoc">弯曲变换(绕 Z 轴弯曲 XZ 平面)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00457">sdf_operations.h:457</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a6538e7ff0033a1a9288cc2d15f4a03a1"><div class="ttname"><a href="namespacevde_1_1sdf.html#a6538e7ff0033a1a9288cc2d15f4a03a1">vde::sdf::op_mirror_y</a></div><div class="ttdeci">Point3D op_mirror_y(const Point3D &amp;p)</div><div class="ttdoc">镜像对称(Y=0 平面)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00299">sdf_operations.h:299</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a9355bc4b4ef7090f7bdcbe9843f8e1a7"><div class="ttname"><a href="namespacevde_1_1sdf.html#a9355bc4b4ef7090f7bdcbe9843f8e1a7">vde::sdf::op_repeat</a></div><div class="ttdeci">Point3D op_repeat(const Point3D &amp;p, const Point3D &amp;cell)</div><div class="ttdoc">无限重复(周期复制)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00251">sdf_operations.h:251</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a93c4506583db122c5b657d39d6d2bb62"><div class="ttname"><a href="namespacevde_1_1sdf.html#a93c4506583db122c5b657d39d6d2bb62">vde::sdf::op_union</a></div><div class="ttdeci">double op_union(double d1, double d2)</div><div class="ttdoc">布尔并集: A B</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00048">sdf_operations.h:48</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_a943524bd6d441649f241702b484c5edb"><div class="ttname"><a href="namespacevde_1_1sdf.html#a943524bd6d441649f241702b484c5edb">vde::sdf::op_smooth_difference</a></div><div class="ttdeci">double op_smooth_difference(double d1, double d2, double k)</div><div class="ttdoc">平滑差集(带混合过渡)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00172">sdf_operations.h:172</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_aa0da23488d5275d8185e452a449bd8c2"><div class="ttname"><a href="namespacevde_1_1sdf.html#aa0da23488d5275d8185e452a449bd8c2">vde::sdf::op_elongate</a></div><div class="ttdeci">Point3D op_elongate(const Point3D &amp;p, const Point3D &amp;h)</div><div class="ttdoc">拉伸/压扁域变形(消除拉伸方向上的内部体积)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00486">sdf_operations.h:486</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_aacbb86f73cd6f9c47e4fbbb4c13a9925"><div class="ttname"><a href="namespacevde_1_1sdf.html#aacbb86f73cd6f9c47e4fbbb4c13a9925">vde::sdf::op_mirror_z</a></div><div class="ttdeci">Point3D op_mirror_z(const Point3D &amp;p)</div><div class="ttdoc">镜像对称(Z=0 平面)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00313">sdf_operations.h:313</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_ab58d71cf3656077b0fb628f67b904e37"><div class="ttname"><a href="namespacevde_1_1sdf.html#ab58d71cf3656077b0fb628f67b904e37">vde::sdf::op_mirror_x</a></div><div class="ttdeci">Point3D op_mirror_x(const Point3D &amp;p, double offset=0.0)</div><div class="ttdoc">镜像对称(X=0 平面),可选偏移</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00279">sdf_operations.h:279</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_abfa3300d4dfaab3011ff58140eee0f5e"><div class="ttname"><a href="namespacevde_1_1sdf.html#abfa3300d4dfaab3011ff58140eee0f5e">vde::sdf::op_translate</a></div><div class="ttdeci">Point3D op_translate(const Point3D &amp;p, const Point3D &amp;offset)</div><div class="ttdoc">空间平移(逆变换)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00339">sdf_operations.h:339</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_acc0f043de0b30ecf426f17602de1a53a"><div class="ttname"><a href="namespacevde_1_1sdf.html#acc0f043de0b30ecf426f17602de1a53a">vde::sdf::op_displace</a></div><div class="ttdeci">double op_displace(double d, const Point3D &amp;p, double amplitude, double frequency)</div><div class="ttdoc">正弦波位移扰动</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00545">sdf_operations.h:545</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_ae59893f12b9e88076f07164209208158"><div class="ttname"><a href="namespacevde_1_1sdf.html#ae59893f12b9e88076f07164209208158">vde::sdf::op_round</a></div><div class="ttdeci">double op_round(double d, double r)</div><div class="ttdoc">圆角偏移: 将等值面向外扩展 r 单位</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00200">sdf_operations.h:200</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_af6c1da88edd1032340478a9d31fee04d"><div class="ttname"><a href="namespacevde_1_1sdf.html#af6c1da88edd1032340478a9d31fee04d">vde::sdf::op_smooth_union</a></div><div class="ttdeci">double op_smooth_union(double d1, double d2, double k)</div><div class="ttdoc">平滑并集(带混合过渡)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00126">sdf_operations.h:126</a></div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_afdef99b133742cf60abd412240f86e21"><div class="ttname"><a href="namespacevde_1_1sdf.html#afdef99b133742cf60abd412240f86e21">vde::sdf::op_smooth_intersection</a></div><div class="ttdeci">double op_smooth_intersection(double d1, double d2, double k)</div><div class="ttdoc">平滑交集(带混合过渡)</div><div class="ttdef"><b>Definition:</b> <a href="sdf__operations_8h_source.html#l00149">sdf_operations.h:149</a></div></div>
<div class="ttc" id="apoint_8h_html"><div class="ttname"><a href="point_8h.html">point.h</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__operations_8h.html">sdf_operations.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>