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

691 lines
46 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::boolean 命名空间参考</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('namespacevde_1_1boolean.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="#enum-members">枚举</a> &#124;
<a href="#func-members">函数</a> </div>
<div class="headertitle">
<div class="title">vde::boolean 命名空间参考</div> </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
枚举</h2></td></tr>
<tr class="memitem:aae782fabf449b767ace57c8103c0e338"><td class="memItemLeft" align="right" valign="top">enum class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338">BooleanOp</a> { <a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338aaef12e903e606a4895a16b393bfdec8c">Union</a>
, <a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338aa06d31c2ee920b4d53e8c9c06d90ba24">Intersection</a>
, <a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338a28ed2ac6c29f64a3692c956004b8ff7a">Difference</a>
, <a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338ab3fff9b7882b88e6b08b2b3090df9de1">SymDiff</a>
}</td></tr>
<tr class="memdesc:aae782fabf449b767ace57c8103c0e338"><td class="mdescLeft">&#160;</td><td class="mdescRight">布尔运算类型 <a href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338">更多...</a><br /></td></tr>
<tr class="separator:aae782fabf449b767ace57c8103c0e338"><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:a69d5b061d79bc7c23b1505c8340777a4"><td class="memItemLeft" align="right" valign="top">std::vector&lt; <a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#a69d5b061d79bc7c23b1505c8340777a4">boolean_2d</a> (const <a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a> &amp;a, const <a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a> &amp;b, <a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338">BooleanOp</a> op)</td></tr>
<tr class="memdesc:a69d5b061d79bc7c23b1505c8340777a4"><td class="mdescLeft">&#160;</td><td class="mdescRight">二维多边形布尔运算 <a href="namespacevde_1_1boolean.html#a69d5b061d79bc7c23b1505c8340777a4">更多...</a><br /></td></tr>
<tr class="separator:a69d5b061d79bc7c23b1505c8340777a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9804b327a1a811593f7129610e2ab1f6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#a9804b327a1a811593f7129610e2ab1f6">mesh_union</a> (const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;a, const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;b)</td></tr>
<tr class="memdesc:a9804b327a1a811593f7129610e2ab1f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">网格并集 A B <a href="namespacevde_1_1boolean.html#a9804b327a1a811593f7129610e2ab1f6">更多...</a><br /></td></tr>
<tr class="separator:a9804b327a1a811593f7129610e2ab1f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:abf255b50c00a9aa991020eb39e800457"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#abf255b50c00a9aa991020eb39e800457">mesh_intersection</a> (const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;a, const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;b)</td></tr>
<tr class="memdesc:abf255b50c00a9aa991020eb39e800457"><td class="mdescLeft">&#160;</td><td class="mdescRight">网格交集 A ∩ B <a href="namespacevde_1_1boolean.html#abf255b50c00a9aa991020eb39e800457">更多...</a><br /></td></tr>
<tr class="separator:abf255b50c00a9aa991020eb39e800457"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab0f79ea9f7f8d2a91329531d2d99e1c3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3">mesh_difference</a> (const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;a, const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;b)</td></tr>
<tr class="memdesc:ab0f79ea9f7f8d2a91329531d2d99e1c3"><td class="mdescLeft">&#160;</td><td class="mdescRight">网格差集 A B <a href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3">更多...</a><br /></td></tr>
<tr class="separator:ab0f79ea9f7f8d2a91329531d2d99e1c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae1b0c6f707a5c6cbe829bed5083264fa"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#ae1b0c6f707a5c6cbe829bed5083264fa">mesh_sym_diff</a> (const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;a, const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;b)</td></tr>
<tr class="memdesc:ae1b0c6f707a5c6cbe829bed5083264fa"><td class="mdescLeft">&#160;</td><td class="mdescRight">网格对称差 (A − B) ∪ (B − A) <a href="namespacevde_1_1boolean.html#ae1b0c6f707a5c6cbe829bed5083264fa">更多...</a><br /></td></tr>
<tr class="separator:ae1b0c6f707a5c6cbe829bed5083264fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad45e2570a6b46624ecc43ccb18e22bac"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#ad45e2570a6b46624ecc43ccb18e22bac">clip_mesh</a> (const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;a, const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;b, bool invert_b=false)</td></tr>
<tr class="memdesc:ad45e2570a6b46624ecc43ccb18e22bac"><td class="mdescLeft">&#160;</td><td class="mdescRight">用网格 B 裁剪网格 A <a href="namespacevde_1_1boolean.html#ad45e2570a6b46624ecc43ccb18e22bac">更多...</a><br /></td></tr>
<tr class="separator:ad45e2570a6b46624ecc43ccb18e22bac"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab7facd7c849be2a97b1e53e8c4602d5c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#ab7facd7c849be2a97b1e53e8c4602d5c">invert_mesh</a> (const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;m)</td></tr>
<tr class="memdesc:ab7facd7c849be2a97b1e53e8c4602d5c"><td class="mdescLeft">&#160;</td><td class="mdescRight">翻转网格所有面片的法线方向 <a href="namespacevde_1_1boolean.html#ab7facd7c849be2a97b1e53e8c4602d5c">更多...</a><br /></td></tr>
<tr class="separator:ab7facd7c849be2a97b1e53e8c4602d5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ae638bb18b0580e662c700358dfbd0dac"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#ae638bb18b0580e662c700358dfbd0dac">merge_meshes</a> (const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;a, const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;b)</td></tr>
<tr class="memdesc:ae638bb18b0580e662c700358dfbd0dac"><td class="mdescLeft">&#160;</td><td class="mdescRight">合并两个网格 <a href="namespacevde_1_1boolean.html#ae638bb18b0580e662c700358dfbd0dac">更多...</a><br /></td></tr>
<tr class="separator:ae638bb18b0580e662c700358dfbd0dac"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a80fa9af2671c97412c95a8a9d592a20c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#a80fa9af2671c97412c95a8a9d592a20c">mesh_boolean</a> (const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;a, const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;b, <a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338">BooleanOp</a> op)</td></tr>
<tr class="memdesc:a80fa9af2671c97412c95a8a9d592a20c"><td class="mdescLeft">&#160;</td><td class="mdescRight">网格布尔运算统一接口 <a href="namespacevde_1_1boolean.html#a80fa9af2671c97412c95a8a9d592a20c">更多...</a><br /></td></tr>
<tr class="separator:a80fa9af2671c97412c95a8a9d592a20c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a35fbe67095edde181fb1f0911d04ae11"><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#a35fbe67095edde181fb1f0911d04ae11">is_point_inside_mesh</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">core::Point3D</a> &amp;p, const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;mesh)</td></tr>
<tr class="memdesc:a35fbe67095edde181fb1f0911d04ae11"><td class="mdescLeft">&#160;</td><td class="mdescRight">判断三维点是否在封闭网格内部 <a href="namespacevde_1_1boolean.html#a35fbe67095edde181fb1f0911d04ae11">更多...</a><br /></td></tr>
<tr class="separator:a35fbe67095edde181fb1f0911d04ae11"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5498aa6722f88e30d5d824c8de391be1"><td class="memItemLeft" align="right" valign="top">std::vector&lt; <a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacevde_1_1boolean.html#a5498aa6722f88e30d5d824c8de391be1">polygon_offset</a> (const <a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a> &amp;poly, double distance)</td></tr>
<tr class="memdesc:a5498aa6722f88e30d5d824c8de391be1"><td class="mdescLeft">&#160;</td><td class="mdescRight">多边形等距偏移 <a href="namespacevde_1_1boolean.html#a5498aa6722f88e30d5d824c8de391be1">更多...</a><br /></td></tr>
<tr class="separator:a5498aa6722f88e30d5d824c8de391be1"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h2 class="groupheader">枚举类型说明</h2>
<a id="aae782fabf449b767ace57c8103c0e338"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aae782fabf449b767ace57c8103c0e338">&#9670;&nbsp;</a></span>BooleanOp</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338">vde::boolean::BooleanOp</a></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">strong</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>布尔运算类型 </p>
<table class="fieldtable">
<tr><th colspan="2">枚举值</th></tr><tr><td class="fieldname"><a id="aae782fabf449b767ace57c8103c0e338aaef12e903e606a4895a16b393bfdec8c"></a>Union&#160;</td><td class="fielddoc"><p>并集 A B </p>
</td></tr>
<tr><td class="fieldname"><a id="aae782fabf449b767ace57c8103c0e338aa06d31c2ee920b4d53e8c9c06d90ba24"></a>Intersection&#160;</td><td class="fielddoc"><p>交集 A ∩ B </p>
</td></tr>
<tr><td class="fieldname"><a id="aae782fabf449b767ace57c8103c0e338a28ed2ac6c29f64a3692c956004b8ff7a"></a>Difference&#160;</td><td class="fielddoc"><p>差集 A B </p>
</td></tr>
<tr><td class="fieldname"><a id="aae782fabf449b767ace57c8103c0e338ab3fff9b7882b88e6b08b2b3090df9de1"></a>SymDiff&#160;</td><td class="fielddoc"><p>对称差 (A B) (B A) </p>
</td></tr>
</table>
<p class="definition">在文件 <a class="el" href="boolean__2d_8h_source.html">boolean_2d.h</a><a class="el" href="boolean__2d_8h_source.html#l00022">22</a> 行定义.</p>
</div>
</div>
<h2 class="groupheader">函数说明</h2>
<a id="a69d5b061d79bc7c23b1505c8340777a4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a69d5b061d79bc7c23b1505c8340777a4">&#9670;&nbsp;</a></span>boolean_2d()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::vector&lt;<a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a>&gt; vde::boolean::boolean_2d </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a> &amp;&#160;</td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a> &amp;&#160;</td>
<td class="paramname"><em>b</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338">BooleanOp</a>&#160;</td>
<td class="paramname"><em>op</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>二维多边形布尔运算 </p>
<p>对两个简单多边形执行指定布尔操作。 当前实现:基于 Vatti 算法的边行走方式处理凸多边形, 可扩展支持任意简单多边形(含孔洞)。</p>
<p>算法流程:</p><ol type="1">
<li>找到两条多边形的所有交点</li>
<li>跟踪边界根据布尔操作选择进入/退出边</li>
<li>组装结果多边形</li>
</ol>
<dl class="section note"><dt>注解</dt><dd>当前版本优化了凸多边形路径。对于带孔洞或自交的 复杂多边形,建议先三角剖分或使用 mesh_boolean。</dd></dl>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">a</td><td>第一个多边形 </td></tr>
<tr><td class="paramname">b</td><td>第二个多边形 </td></tr>
<tr><td class="paramname">op</td><td>布尔操作类型 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>结果多边形列表(可能有多个分离的组件)</dd></dl>
<div class="fragment"><div class="line">Polygon2D p1 = make_circle(10, <a class="code" href="namespacevde_1_1core.html#a78483c599a40e4f333418667a77e3862">Point2D</a>{0,0}, 5.0);</div>
<div class="line">Polygon2D p2 = make_circle(10, <a class="code" href="namespacevde_1_1core.html#a78483c599a40e4f333418667a77e3862">Point2D</a>{3,0}, 5.0);</div>
<div class="line"><span class="keyword">auto</span> result = <a class="code" href="namespacevde_1_1boolean.html#a69d5b061d79bc7c23b1505c8340777a4">boolean_2d</a>(p1, p2, <a class="code" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338aaef12e903e606a4895a16b393bfdec8c">BooleanOp::Union</a>);</div>
<div class="ttc" id="anamespacevde_1_1boolean_html_a69d5b061d79bc7c23b1505c8340777a4"><div class="ttname"><a href="namespacevde_1_1boolean.html#a69d5b061d79bc7c23b1505c8340777a4">vde::boolean::boolean_2d</a></div><div class="ttdeci">std::vector&lt; Polygon2D &gt; boolean_2d(const Polygon2D &amp;a, const Polygon2D &amp;b, BooleanOp op)</div><div class="ttdoc">二维多边形布尔运算</div></div>
<div class="ttc" id="anamespacevde_1_1boolean_html_aae782fabf449b767ace57c8103c0e338aaef12e903e606a4895a16b393bfdec8c"><div class="ttname"><a href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338aaef12e903e606a4895a16b393bfdec8c">vde::boolean::BooleanOp::Union</a></div><div class="ttdeci">@ Union</div></div>
<div class="ttc" id="anamespacevde_1_1core_html_a78483c599a40e4f333418667a77e3862"><div class="ttname"><a href="namespacevde_1_1core.html#a78483c599a40e4f333418667a77e3862">vde::core::Point2D</a></div><div class="ttdeci">foundation::Point2D Point2D</div><div class="ttdoc">双精度二维点(重新导出)</div><div class="ttdef"><b>Definition:</b> <a href="point_8h_source.html#l00029">point.h:29</a></div></div>
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338" title="布尔运算类型">BooleanOp</a>, <a class="el" href="namespacevde_1_1boolean.html#a80fa9af2671c97412c95a8a9d592a20c" title="网格布尔运算统一接口">mesh_boolean</a>, <a class="el" href="namespacevde_1_1boolean.html#a5498aa6722f88e30d5d824c8de391be1" title="多边形等距偏移">polygon_offset</a> </dd></dl>
</div>
</div>
<a id="ad45e2570a6b46624ecc43ccb18e22bac"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad45e2570a6b46624ecc43ccb18e22bac">&#9670;&nbsp;</a></span>clip_mesh()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> vde::boolean::clip_mesh </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>b</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool&#160;</td>
<td class="paramname"><em>invert_b</em> = <code>false</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>用网格 B 裁剪网格 A </p>
<p>保留网格 A 中位于 B 体外的面片。 是 mesh_difference 的简化变体,仅输出来自 A 的面片。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">a</td><td>待裁剪网格 </td></tr>
<tr><td class="paramname">b</td><td>裁剪体网格 </td></tr>
<tr><td class="paramname">invert_b</td><td>若为 true,将 B 的内外判定取反(裁剪外部) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>裁剪后的网格(仅包含 A 的面片)</dd></dl>
<div class="fragment"><div class="line"><span class="comment">// 裁剪 cube 外部的 sphere 面片</span></div>
<div class="line"><span class="keyword">auto</span> clipped = <a class="code" href="namespacevde_1_1boolean.html#ad45e2570a6b46624ecc43ccb18e22bac">clip_mesh</a>(<a class="code" href="namespacevde_1_1sdf.html#ab544a3ebc4c0844b322b73bbbe4efb3f">sphere</a>, cube, <span class="keyword">false</span> <span class="comment">// invert_b);</span></div>
<div class="line"><span class="comment">// 保留 cube 内部的 sphere 面片</span></div>
<div class="line"><span class="keyword">auto</span> inner = <a class="code" href="namespacevde_1_1boolean.html#ad45e2570a6b46624ecc43ccb18e22bac">clip_mesh</a>(<a class="code" href="namespacevde_1_1sdf.html#ab544a3ebc4c0844b322b73bbbe4efb3f">sphere</a>, cube, <span class="keyword">true</span> <span class="comment">// invert_b);</span></div>
<div class="ttc" id="anamespacevde_1_1boolean_html_ad45e2570a6b46624ecc43ccb18e22bac"><div class="ttname"><a href="namespacevde_1_1boolean.html#ad45e2570a6b46624ecc43ccb18e22bac">vde::boolean::clip_mesh</a></div><div class="ttdeci">HalfedgeMesh clip_mesh(const HalfedgeMesh &amp;a, const HalfedgeMesh &amp;b, bool invert_b=false)</div><div class="ttdoc">用网格 B 裁剪网格 A</div></div>
<div class="ttc" id="anamespacevde_1_1sdf_html_ab544a3ebc4c0844b322b73bbbe4efb3f"><div class="ttname"><a href="namespacevde_1_1sdf.html#ab544a3ebc4c0844b322b73bbbe4efb3f">vde::sdf::sphere</a></div><div class="ttdeci">double sphere(const Point3D &amp;p, double radius)</div><div class="ttdoc">球体的 SDF</div><div class="ttdef"><b>Definition:</b> <a href="sdf__primitives_8h_source.html#l00068">sdf_primitives.h:68</a></div></div>
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3" title="网格差集 A B">mesh_difference</a>, <a class="el" href="namespacevde_1_1boolean.html#a35fbe67095edde181fb1f0911d04ae11" title="判断三维点是否在封闭网格内部">is_point_inside_mesh</a> </dd></dl>
</div>
</div>
<a id="ab7facd7c849be2a97b1e53e8c4602d5c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab7facd7c849be2a97b1e53e8c4602d5c">&#9670;&nbsp;</a></span>invert_mesh()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> vde::boolean::invert_mesh </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>m</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>翻转网格所有面片的法线方向 </p>
<p>遍历所有面片,反转其顶点环绕顺序。 常用于生成负体积(反向外壳)或差集操作中。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">m</td><td>原始网格 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>法线翻转后的网格</dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3" title="网格差集 A B">mesh_difference</a> </dd></dl>
</div>
</div>
<a id="a35fbe67095edde181fb1f0911d04ae11"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a35fbe67095edde181fb1f0911d04ae11">&#9670;&nbsp;</a></span>is_point_inside_mesh()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">bool vde::boolean::is_point_inside_mesh </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">core::Point3D</a> &amp;&#160;</td>
<td class="paramname"><em>p</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>mesh</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>判断三维点是否在封闭网格内部 </p>
<p>使用射线投射法:从点 p 向任意方向射出射线, 统计与网格面片的交点数量。 奇数表示在内部,偶数表示在外部。</p>
<p>算法:</p><ol type="1">
<li>构造从 p 出发沿 +x 方向的射线</li>
<li>遍历所有三角形进行射线-三角形求交</li>
<li>统计交点数量</li>
<li>返回奇偶性判定结果</li>
</ol>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">p</td><td>待判定点 </td></tr>
<tr><td class="paramname">mesh</td><td>封闭网格 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>点在网格内部返回 true</dd></dl>
<dl class="section note"><dt>注解</dt><dd>网格必须是封闭(水密)的,否则结果不可靠。 点恰好落在面上时行为未定义。</dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#ad45e2570a6b46624ecc43ccb18e22bac" title="用网格 B 裁剪网格 A">clip_mesh</a>, <a class="el" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3" title="网格差集 A B">mesh_difference</a> </dd></dl>
</div>
</div>
<a id="ae638bb18b0580e662c700358dfbd0dac"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae638bb18b0580e662c700358dfbd0dac">&#9670;&nbsp;</a></span>merge_meshes()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> vde::boolean::merge_meshes </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>b</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>合并两个网格 </p>
<p>将两个网格的顶点和面片直接拼接,不做布尔操作。 用于将分离的网格组件合并到单个数据结构中。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">a</td><td>网格 A </td></tr>
<tr><td class="paramname">b</td><td>网格 B </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>包含 A 和 B 全部顶点和面片的合并网格</dd></dl>
<dl class="section note"><dt>注解</dt><dd>不处理重叠区域;仅做纯几何拼接</dd></dl>
<dl class="section see"><dt>参见</dt><dd>mesh_union(做布尔合并) </dd></dl>
</div>
</div>
<a id="a80fa9af2671c97412c95a8a9d592a20c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a80fa9af2671c97412c95a8a9d592a20c">&#9670;&nbsp;</a></span>mesh_boolean()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> vde::boolean::mesh_boolean </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>b</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338">BooleanOp</a>&#160;</td>
<td class="paramname"><em>op</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>网格布尔运算统一接口 </p>
<p>根据布尔操作类型分发到对应的具体函数。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">a</td><td>网格 A </td></tr>
<tr><td class="paramname">b</td><td>网格 B </td></tr>
<tr><td class="paramname">op</td><td>布尔操作类型 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>结果网格</dd></dl>
<div class="fragment"><div class="line"><span class="keyword">auto</span> result = <a class="code" href="namespacevde_1_1boolean.html#a80fa9af2671c97412c95a8a9d592a20c">mesh_boolean</a>(cube, <a class="code" href="namespacevde_1_1sdf.html#ab544a3ebc4c0844b322b73bbbe4efb3f">sphere</a>, <a class="code" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338aa06d31c2ee920b4d53e8c9c06d90ba24">BooleanOp::Intersection</a>);</div>
<div class="ttc" id="anamespacevde_1_1boolean_html_a80fa9af2671c97412c95a8a9d592a20c"><div class="ttname"><a href="namespacevde_1_1boolean.html#a80fa9af2671c97412c95a8a9d592a20c">vde::boolean::mesh_boolean</a></div><div class="ttdeci">HalfedgeMesh mesh_boolean(const HalfedgeMesh &amp;a, const HalfedgeMesh &amp;b, BooleanOp op)</div><div class="ttdoc">网格布尔运算统一接口</div></div>
<div class="ttc" id="anamespacevde_1_1boolean_html_aae782fabf449b767ace57c8103c0e338aa06d31c2ee920b4d53e8c9c06d90ba24"><div class="ttname"><a href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338aa06d31c2ee920b4d53e8c9c06d90ba24">vde::boolean::BooleanOp::Intersection</a></div><div class="ttdeci">@ Intersection</div></div>
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#aae782fabf449b767ace57c8103c0e338" title="布尔运算类型">BooleanOp</a>, <a class="el" href="namespacevde_1_1boolean.html#a9804b327a1a811593f7129610e2ab1f6" title="网格并集 A B">mesh_union</a>, <a class="el" href="namespacevde_1_1boolean.html#abf255b50c00a9aa991020eb39e800457" title="网格交集 A ∩ B">mesh_intersection</a>, <a class="el" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3" title="网格差集 A B">mesh_difference</a>, <a class="el" href="namespacevde_1_1boolean.html#ae1b0c6f707a5c6cbe829bed5083264fa" title="网格对称差 (A B) (B A)">mesh_sym_diff</a> </dd></dl>
</div>
</div>
<a id="ab0f79ea9f7f8d2a91329531d2d99e1c3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab0f79ea9f7f8d2a91329531d2d99e1c3">&#9670;&nbsp;</a></span>mesh_difference()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> vde::boolean::mesh_difference </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>b</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>网格差集 A B </p>
<p>保留网格 A 中重心在网格 B 外的面片, 以及网格 B 中重心在网格 A 内的面片(翻转法线)。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">a</td><td>网格 A </td></tr>
<tr><td class="paramname">b</td><td>网格 B </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>A B 的差集网格</dd></dl>
<dl class="section note"><dt>注解</dt><dd>结果中来自 B 的面片会被翻转法线以保持内-外一致性</dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#a9804b327a1a811593f7129610e2ab1f6" title="网格并集 A B">mesh_union</a>, <a class="el" href="namespacevde_1_1boolean.html#abf255b50c00a9aa991020eb39e800457" title="网格交集 A ∩ B">mesh_intersection</a>, <a class="el" href="namespacevde_1_1boolean.html#ae1b0c6f707a5c6cbe829bed5083264fa" title="网格对称差 (A B) (B A)">mesh_sym_diff</a> </dd></dl>
</div>
</div>
<a id="abf255b50c00a9aa991020eb39e800457"></a>
<h2 class="memtitle"><span class="permalink"><a href="#abf255b50c00a9aa991020eb39e800457">&#9670;&nbsp;</a></span>mesh_intersection()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> vde::boolean::mesh_intersection </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>b</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>网格交集 A ∩ B </p>
<p>保留网格 A 中重心在网格 B 内的面片, 以及网格 B 中重心在网格 A 内的面片。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">a</td><td>网格 A </td></tr>
<tr><td class="paramname">b</td><td>网格 B </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>A ∩ B 的交集网格</dd></dl>
<dl class="section note"><dt>注解</dt><dd>结果体积为两网格公共区域</dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#a9804b327a1a811593f7129610e2ab1f6" title="网格并集 A B">mesh_union</a>, <a class="el" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3" title="网格差集 A B">mesh_difference</a> </dd></dl>
</div>
</div>
<a id="ae1b0c6f707a5c6cbe829bed5083264fa"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ae1b0c6f707a5c6cbe829bed5083264fa">&#9670;&nbsp;</a></span>mesh_sym_diff()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> vde::boolean::mesh_sym_diff </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>b</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>网格对称差 (A − B) ∪ (B − A) </p>
<p>等价于: </p><div class="fragment"><div class="line"><a class="code" href="namespacevde_1_1boolean.html#a9804b327a1a811593f7129610e2ab1f6">mesh_union</a>(<a class="code" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3">mesh_difference</a>(a, b), <a class="code" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3">mesh_difference</a>(b, a))</div>
<div class="ttc" id="anamespacevde_1_1boolean_html_a9804b327a1a811593f7129610e2ab1f6"><div class="ttname"><a href="namespacevde_1_1boolean.html#a9804b327a1a811593f7129610e2ab1f6">vde::boolean::mesh_union</a></div><div class="ttdeci">HalfedgeMesh mesh_union(const HalfedgeMesh &amp;a, const HalfedgeMesh &amp;b)</div><div class="ttdoc">网格并集 A B</div></div>
<div class="ttc" id="anamespacevde_1_1boolean_html_ab0f79ea9f7f8d2a91329531d2d99e1c3"><div class="ttname"><a href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3">vde::boolean::mesh_difference</a></div><div class="ttdeci">HalfedgeMesh mesh_difference(const HalfedgeMesh &amp;a, const HalfedgeMesh &amp;b)</div><div class="ttdoc">网格差集 A B</div></div>
</div><!-- fragment --><dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">a</td><td>网格 A </td></tr>
<tr><td class="paramname">b</td><td>网格 B </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>对称差网格</dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3" title="网格差集 A B">mesh_difference</a>, <a class="el" href="namespacevde_1_1boolean.html#a9804b327a1a811593f7129610e2ab1f6" title="网格并集 A B">mesh_union</a> </dd></dl>
</div>
</div>
<a id="a9804b327a1a811593f7129610e2ab1f6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9804b327a1a811593f7129610e2ab1f6">&#9670;&nbsp;</a></span>mesh_union()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> vde::boolean::mesh_union </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>a</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="classvde_1_1mesh_1_1HalfedgeMesh.html">HalfedgeMesh</a> &amp;&#160;</td>
<td class="paramname"><em>b</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>网格并集 A B </p>
<p>保留网格 A 中重心在网格 B 外的面片, 以及网格 B 中重心在网格 A 外的面片。 合并后形成两个网格的并集体积。</p>
<p>原理:对每个面片计算重心坐标,用射线投射判断 该点是否在对方网格内部,据此决定保留或剔除。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">a</td><td>网格 A </td></tr>
<tr><td class="paramname">b</td><td>网格 B </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>A B 的合并网格</dd></dl>
<div class="fragment"><div class="line">HalfedgeMesh result = <a class="code" href="namespacevde_1_1boolean.html#a9804b327a1a811593f7129610e2ab1f6">mesh_union</a>(cube, <a class="code" href="namespacevde_1_1sdf.html#ab544a3ebc4c0844b322b73bbbe4efb3f">sphere</a>);</div>
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#abf255b50c00a9aa991020eb39e800457" title="网格交集 A ∩ B">mesh_intersection</a>, <a class="el" href="namespacevde_1_1boolean.html#ab0f79ea9f7f8d2a91329531d2d99e1c3" title="网格差集 A B">mesh_difference</a>, <a class="el" href="namespacevde_1_1boolean.html#a35fbe67095edde181fb1f0911d04ae11" title="判断三维点是否在封闭网格内部">is_point_inside_mesh</a> </dd></dl>
</div>
</div>
<a id="a5498aa6722f88e30d5d824c8de391be1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a5498aa6722f88e30d5d824c8de391be1">&#9670;&nbsp;</a></span>polygon_offset()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::vector&lt;<a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a>&gt; vde::boolean::polygon_offset </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1core_1_1Polygon2D.html">Polygon2D</a> &amp;&#160;</td>
<td class="paramname"><em>poly</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>多边形等距偏移 </p>
<p>将多边形的每条边沿其法线方向平移指定距离, 在转角处自动生成圆弧/斜角连接。</p>
<p>算法:</p><ol type="1">
<li>对每条边计算单位外法线</li>
<li>沿法线平移 distance 距离</li>
<li>相邻偏移边求交形成新的顶点</li>
<li>检测自交并移除退化区域</li>
</ol>
<ul>
<li>正距离 = 外扩(膨胀/Inflation</li>
<li>负距离 = 内缩(偏置/Deflation</li>
</ul>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">poly</td><td>原始多边形 </td></tr>
<tr><td class="paramname">distance</td><td>偏移距离(正=外扩,负=内缩) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>偏移后的多边形列表(内缩或自交可能产生多个碎片)</dd></dl>
<dl class="section note"><dt>注解</dt><dd>使用直骨架近似而非精确圆弧偏移,转角处为斜角连接。 大距离负偏移可能导致多边形完全消失(返回空列表)。</dd></dl>
<div class="fragment"><div class="line">Polygon2D rect = {{0,0}, {10,0}, {10,5}, {0,5}};</div>
<div class="line"><span class="comment">// 外扩 2 单位</span></div>
<div class="line"><span class="keyword">auto</span> inflated = <a class="code" href="namespacevde_1_1boolean.html#a5498aa6722f88e30d5d824c8de391be1">polygon_offset</a>(rect, 2.0);</div>
<div class="line"><span class="comment">// 内缩 1 单位(生成工具路径)</span></div>
<div class="line"><span class="keyword">auto</span> toolpath = <a class="code" href="namespacevde_1_1boolean.html#a5498aa6722f88e30d5d824c8de391be1">polygon_offset</a>(rect, -1.0);</div>
<div class="ttc" id="anamespacevde_1_1boolean_html_a5498aa6722f88e30d5d824c8de391be1"><div class="ttname"><a href="namespacevde_1_1boolean.html#a5498aa6722f88e30d5d824c8de391be1">vde::boolean::polygon_offset</a></div><div class="ttdeci">std::vector&lt; Polygon2D &gt; polygon_offset(const Polygon2D &amp;poly, double distance)</div><div class="ttdoc">多边形等距偏移</div></div>
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="namespacevde_1_1boolean.html#a69d5b061d79bc7c23b1505c8340777a4" title="二维多边形布尔运算">boolean_2d</a> </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="navelem"><a class="el" href="namespacevde.html">vde</a></li><li class="navelem"><a class="el" href="namespacevde_1_1boolean.html">boolean</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>