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

1351 lines
80 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: 核心几何模块</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">ViewDesignEngine
&#160;<span id="projectnumber">3.1.0</span>
</div>
<div id="projectbrief">高性能 CAD 计算几何引擎</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'搜索','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
initMenu('',true,false,'search.php','搜索');
$(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('group__core.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes"></a> &#124;
<a href="#typedef-members">类型定义</a> &#124;
<a href="#func-members">函数</a> </div>
<div class="headertitle">
<div class="title">核心几何模块</div> </div>
</div><!--header-->
<div class="contents">
<p>点/向量/变换、多边形、凸包、Voronoi、ICP、距离计算
<a href="#details">更多...</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1core_1_1AABB.html">vde::core::AABB&lt; T &gt;</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">轴对齐包围盒(AABB <a href="classvde_1_1core_1_1AABB.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structvde_1_1core_1_1ICPResult.html">vde::core::ICPResult</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">ICP(迭代最近点)配准结果 <a href="structvde_1_1core_1_1ICPResult.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1core_1_1Line3D.html">vde::core::Line3D&lt; T &gt;</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">三维无限直线 <a href="classvde_1_1core_1_1Line3D.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1core_1_1Segment3D.html">vde::core::Segment3D&lt; T &gt;</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">三维线段 <a href="classvde_1_1core_1_1Segment3D.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1core_1_1Ray3D.html">vde::core::Ray3D&lt; T &gt;</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">三维射线 <a href="classvde_1_1core_1_1Ray3D.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1core_1_1Plane.html">vde::core::Plane&lt; T &gt;</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">三维平面 <a href="classvde_1_1core_1_1Plane.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1core_1_1Polygon2D.html">vde::core::Polygon2D</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">二维平面多边形 <a href="classvde_1_1core_1_1Polygon2D.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classvde_1_1core_1_1Triangle.html">vde::core::Triangle&lt; T &gt;</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">三维三角形 <a href="classvde_1_1core_1_1Triangle.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structvde_1_1core_1_1VoronoiCell.html">vde::core::VoronoiCell</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Voronoi 单元格 <a href="structvde_1_1core_1_1VoronoiCell.html#details">更多...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
类型定义</h2></td></tr>
<tr class="memitem:ga1d6b7ffb62cc56245fac3b5939f0df80"><td class="memItemLeft" align="right" valign="top">using&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">vde::core::Transform3D</a> = Eigen::Transform&lt; double, 3, Eigen::Affine &gt;</td></tr>
<tr class="memdesc:ga1d6b7ffb62cc56245fac3b5939f0df80"><td class="mdescLeft">&#160;</td><td class="mdescRight">三维仿射变换类型 <a href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">更多...</a><br /></td></tr>
<tr class="separator:ga1d6b7ffb62cc56245fac3b5939f0df80"><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:gaacb80a198879458b0a6e48a9e5a47da2"><td class="memItemLeft" align="right" valign="top">std::vector&lt; <a class="el" href="namespacevde_1_1core.html#a78483c599a40e4f333418667a77e3862">Point2D</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gaacb80a198879458b0a6e48a9e5a47da2">vde::core::convex_hull_2d</a> (const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#a78483c599a40e4f333418667a77e3862">Point2D</a> &gt; &amp;points)</td></tr>
<tr class="memdesc:gaacb80a198879458b0a6e48a9e5a47da2"><td class="mdescLeft">&#160;</td><td class="mdescRight">二维凸包计算(Graham Scan 算法) <a href="group__core.html#gaacb80a198879458b0a6e48a9e5a47da2">更多...</a><br /></td></tr>
<tr class="separator:gaacb80a198879458b0a6e48a9e5a47da2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4b65dcd970fc3b5de01d5506e326bf46"><td class="memItemLeft" align="right" valign="top">std::vector&lt; std::array&lt; <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>, 3 &gt; &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga4b65dcd970fc3b5de01d5506e326bf46">vde::core::convex_hull_3d</a> (const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &gt; &amp;points)</td></tr>
<tr class="memdesc:ga4b65dcd970fc3b5de01d5506e326bf46"><td class="mdescLeft">&#160;</td><td class="mdescRight">三维凸包计算(QuickHull 算法) <a href="group__core.html#ga4b65dcd970fc3b5de01d5506e326bf46">更多...</a><br /></td></tr>
<tr class="separator:ga4b65dcd970fc3b5de01d5506e326bf46"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga8378489b455ccc35eb29dcb1a874bbd0"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga8378489b455ccc35eb29dcb1a874bbd0">vde::core::distance</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;a, const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;b)</td></tr>
<tr class="memdesc:ga8378489b455ccc35eb29dcb1a874bbd0"><td class="mdescLeft">&#160;</td><td class="mdescRight">两点之间的欧氏距离 <a href="group__core.html#ga8378489b455ccc35eb29dcb1a874bbd0">更多...</a><br /></td></tr>
<tr class="separator:ga8378489b455ccc35eb29dcb1a874bbd0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1bd9e26be7d281523753d2681837b92e"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga1bd9e26be7d281523753d2681837b92e">vde::core::distance</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;p, const <a class="el" href="classvde_1_1core_1_1Line3D.html">Line3D</a>&lt; double &gt; &amp;line)</td></tr>
<tr class="memdesc:ga1bd9e26be7d281523753d2681837b92e"><td class="mdescLeft">&#160;</td><td class="mdescRight">点到直线的距离 <a href="group__core.html#ga1bd9e26be7d281523753d2681837b92e">更多...</a><br /></td></tr>
<tr class="separator:ga1bd9e26be7d281523753d2681837b92e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga7468571f81e61ca34a4b34f16b33dfab"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga7468571f81e61ca34a4b34f16b33dfab">vde::core::distance</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;p, const <a class="el" href="classvde_1_1core_1_1Segment3D.html">Segment3D</a>&lt; double &gt; &amp;seg)</td></tr>
<tr class="memdesc:ga7468571f81e61ca34a4b34f16b33dfab"><td class="mdescLeft">&#160;</td><td class="mdescRight">点到线段的距离 <a href="group__core.html#ga7468571f81e61ca34a4b34f16b33dfab">更多...</a><br /></td></tr>
<tr class="separator:ga7468571f81e61ca34a4b34f16b33dfab"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4a05820313877ebc46d972465a448e52"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga4a05820313877ebc46d972465a448e52">vde::core::distance</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;p, const <a class="el" href="classvde_1_1core_1_1Plane.html">Plane</a>&lt; double &gt; &amp;plane)</td></tr>
<tr class="memdesc:ga4a05820313877ebc46d972465a448e52"><td class="mdescLeft">&#160;</td><td class="mdescRight">点到平面的距离 <a href="group__core.html#ga4a05820313877ebc46d972465a448e52">更多...</a><br /></td></tr>
<tr class="separator:ga4a05820313877ebc46d972465a448e52"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga60c1aaba85c90f7e0f1090a3a8fff099"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga60c1aaba85c90f7e0f1090a3a8fff099">vde::core::distance</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;p, const <a class="el" href="classvde_1_1core_1_1Triangle.html">Triangle</a>&lt; double &gt; &amp;tri)</td></tr>
<tr class="memdesc:ga60c1aaba85c90f7e0f1090a3a8fff099"><td class="mdescLeft">&#160;</td><td class="mdescRight">点到三角形的距离 <a href="group__core.html#ga60c1aaba85c90f7e0f1090a3a8fff099">更多...</a><br /></td></tr>
<tr class="separator:ga60c1aaba85c90f7e0f1090a3a8fff099"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga47add037521cc2500a05b3630ade36f4"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga47add037521cc2500a05b3630ade36f4">vde::core::distance</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;p, const <a class="el" href="classvde_1_1core_1_1AABB.html">AABB</a>&lt; double &gt; &amp;box)</td></tr>
<tr class="memdesc:ga47add037521cc2500a05b3630ade36f4"><td class="mdescLeft">&#160;</td><td class="mdescRight">点到包围盒的距离 <a href="group__core.html#ga47add037521cc2500a05b3630ade36f4">更多...</a><br /></td></tr>
<tr class="separator:ga47add037521cc2500a05b3630ade36f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1d6b1a31af4a149f94e89235d4159f06"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga1d6b1a31af4a149f94e89235d4159f06">vde::core::distance</a> (const <a class="el" href="classvde_1_1core_1_1Segment3D.html">Segment3D</a>&lt; double &gt; &amp;a, const <a class="el" href="classvde_1_1core_1_1Segment3D.html">Segment3D</a>&lt; double &gt; &amp;b)</td></tr>
<tr class="memdesc:ga1d6b1a31af4a149f94e89235d4159f06"><td class="mdescLeft">&#160;</td><td class="mdescRight">两条线段之间的最短距离 <a href="group__core.html#ga1d6b1a31af4a149f94e89235d4159f06">更多...</a><br /></td></tr>
<tr class="separator:ga1d6b1a31af4a149f94e89235d4159f06"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0f6b23d8527e9527668af106edd4c188"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga0f6b23d8527e9527668af106edd4c188">vde::core::distance</a> (const <a class="el" href="classvde_1_1core_1_1Line3D.html">Line3D</a>&lt; double &gt; &amp;a, const <a class="el" href="classvde_1_1core_1_1Line3D.html">Line3D</a>&lt; double &gt; &amp;b)</td></tr>
<tr class="memdesc:ga0f6b23d8527e9527668af106edd4c188"><td class="mdescLeft">&#160;</td><td class="mdescRight">两条直线之间的最短距离 <a href="group__core.html#ga0f6b23d8527e9527668af106edd4c188">更多...</a><br /></td></tr>
<tr class="separator:ga0f6b23d8527e9527668af106edd4c188"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga813b7b5d20316f958b43b4c5a58a4883"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga813b7b5d20316f958b43b4c5a58a4883">vde::core::distance</a> (const <a class="el" href="classvde_1_1core_1_1AABB.html">AABB</a>&lt; double &gt; &amp;a, const <a class="el" href="classvde_1_1core_1_1AABB.html">AABB</a>&lt; double &gt; &amp;b)</td></tr>
<tr class="memdesc:ga813b7b5d20316f958b43b4c5a58a4883"><td class="mdescLeft">&#160;</td><td class="mdescRight">两个包围盒之间的最短距离 <a href="group__core.html#ga813b7b5d20316f958b43b4c5a58a4883">更多...</a><br /></td></tr>
<tr class="separator:ga813b7b5d20316f958b43b4c5a58a4883"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa22348c98076275fa470fb309c495b07"><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gaa22348c98076275fa470fb309c495b07">vde::core::distance</a> (const <a class="el" href="classvde_1_1core_1_1Triangle.html">Triangle</a>&lt; double &gt; &amp;a, const <a class="el" href="classvde_1_1core_1_1Triangle.html">Triangle</a>&lt; double &gt; &amp;b)</td></tr>
<tr class="memdesc:gaa22348c98076275fa470fb309c495b07"><td class="mdescLeft">&#160;</td><td class="mdescRight">两个三角形之间的最短距离 <a href="group__core.html#gaa22348c98076275fa470fb309c495b07">更多...</a><br /></td></tr>
<tr class="separator:gaa22348c98076275fa470fb309c495b07"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gadb95bcdf9ce6420abfd95eee4d465bde"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gadb95bcdf9ce6420abfd95eee4d465bde">vde::core::closest_point</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;p, const <a class="el" href="classvde_1_1core_1_1Triangle.html">Triangle</a>&lt; double &gt; &amp;tri)</td></tr>
<tr class="memdesc:gadb95bcdf9ce6420abfd95eee4d465bde"><td class="mdescLeft">&#160;</td><td class="mdescRight">三角形上距给定点最近的点 <a href="group__core.html#gadb95bcdf9ce6420abfd95eee4d465bde">更多...</a><br /></td></tr>
<tr class="separator:gadb95bcdf9ce6420abfd95eee4d465bde"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1a7cb315df51ac922d9e9d207950ec43"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga1a7cb315df51ac922d9e9d207950ec43">vde::core::closest_point</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;p, const <a class="el" href="classvde_1_1core_1_1Segment3D.html">Segment3D</a>&lt; double &gt; &amp;seg)</td></tr>
<tr class="memdesc:ga1a7cb315df51ac922d9e9d207950ec43"><td class="mdescLeft">&#160;</td><td class="mdescRight">线段上距给定点最近的点 <a href="group__core.html#ga1a7cb315df51ac922d9e9d207950ec43">更多...</a><br /></td></tr>
<tr class="separator:ga1a7cb315df51ac922d9e9d207950ec43"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad6bb2e0732fc636a0e157af3646e53bc"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gad6bb2e0732fc636a0e157af3646e53bc">vde::core::closest_point</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;p, const <a class="el" href="classvde_1_1core_1_1AABB.html">AABB</a>&lt; double &gt; &amp;box)</td></tr>
<tr class="memdesc:gad6bb2e0732fc636a0e157af3646e53bc"><td class="mdescLeft">&#160;</td><td class="mdescRight">包围盒上距给定点最近的点 <a href="group__core.html#gad6bb2e0732fc636a0e157af3646e53bc">更多...</a><br /></td></tr>
<tr class="separator:gad6bb2e0732fc636a0e157af3646e53bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga9ba9a9d242d667d9a257ca5b4bfbaff1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga9ba9a9d242d667d9a257ca5b4bfbaff1">vde::core::closest_point</a> (const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &amp;p, const <a class="el" href="classvde_1_1core_1_1Plane.html">Plane</a>&lt; double &gt; &amp;plane)</td></tr>
<tr class="memdesc:ga9ba9a9d242d667d9a257ca5b4bfbaff1"><td class="mdescLeft">&#160;</td><td class="mdescRight">平面上距给定点最近的点(正交投影) <a href="group__core.html#ga9ba9a9d242d667d9a257ca5b4bfbaff1">更多...</a><br /></td></tr>
<tr class="separator:ga9ba9a9d242d667d9a257ca5b4bfbaff1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gabaf3dea80baf0c0ef81e5de25841e8e0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structvde_1_1core_1_1ICPResult.html">ICPResult</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gabaf3dea80baf0c0ef81e5de25841e8e0">vde::core::icp_register</a> (const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &gt; &amp;source, const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &gt; &amp;target, int max_iter=50, double tolerance=1e-6)</td></tr>
<tr class="memdesc:gabaf3dea80baf0c0ef81e5de25841e8e0"><td class="mdescLeft">&#160;</td><td class="mdescRight">迭代最近点(ICP)刚体点云配准 <a href="group__core.html#gabaf3dea80baf0c0ef81e5de25841e8e0">更多...</a><br /></td></tr>
<tr class="separator:gabaf3dea80baf0c0ef81e5de25841e8e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac8fbd42a8dac9187eef97b9a393f948b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gac8fbd42a8dac9187eef97b9a393f948b">vde::core::translate</a> (const <a class="el" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a> &amp;v)</td></tr>
<tr class="memdesc:gac8fbd42a8dac9187eef97b9a393f948b"><td class="mdescLeft">&#160;</td><td class="mdescRight">创建平移变换 <a href="group__core.html#gac8fbd42a8dac9187eef97b9a393f948b">更多...</a><br /></td></tr>
<tr class="separator:gac8fbd42a8dac9187eef97b9a393f948b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga938b1dfb9688f3b94b88a219c0e69aec"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga938b1dfb9688f3b94b88a219c0e69aec">vde::core::translate</a> (double x, double y, double z)</td></tr>
<tr class="memdesc:ga938b1dfb9688f3b94b88a219c0e69aec"><td class="mdescLeft">&#160;</td><td class="mdescRight">创建平移变换(分量形式) <a href="group__core.html#ga938b1dfb9688f3b94b88a219c0e69aec">更多...</a><br /></td></tr>
<tr class="separator:ga938b1dfb9688f3b94b88a219c0e69aec"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa8821904ace09771bb66a626ecbdb3fb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gaa8821904ace09771bb66a626ecbdb3fb">vde::core::rotate</a> (const <a class="el" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a> &amp;axis, double angle_rad)</td></tr>
<tr class="memdesc:gaa8821904ace09771bb66a626ecbdb3fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">创建旋转变换(轴-角表示) <a href="group__core.html#gaa8821904ace09771bb66a626ecbdb3fb">更多...</a><br /></td></tr>
<tr class="separator:gaa8821904ace09771bb66a626ecbdb3fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga81af7f4bc18bd5159a2f10d661af320f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga81af7f4bc18bd5159a2f10d661af320f">vde::core::rotate_x</a> (double rad)</td></tr>
<tr class="memdesc:ga81af7f4bc18bd5159a2f10d661af320f"><td class="mdescLeft">&#160;</td><td class="mdescRight">绕 X 轴旋转 <a href="group__core.html#ga81af7f4bc18bd5159a2f10d661af320f">更多...</a><br /></td></tr>
<tr class="separator:ga81af7f4bc18bd5159a2f10d661af320f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gae14e5be60107581d9b2af2fb2b43e711"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gae14e5be60107581d9b2af2fb2b43e711">vde::core::rotate_y</a> (double rad)</td></tr>
<tr class="memdesc:gae14e5be60107581d9b2af2fb2b43e711"><td class="mdescLeft">&#160;</td><td class="mdescRight">绕 Y 轴旋转 <a href="group__core.html#gae14e5be60107581d9b2af2fb2b43e711">更多...</a><br /></td></tr>
<tr class="separator:gae14e5be60107581d9b2af2fb2b43e711"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaf0b49b7358d2c526619437815b90ff63"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gaf0b49b7358d2c526619437815b90ff63">vde::core::rotate_z</a> (double rad)</td></tr>
<tr class="memdesc:gaf0b49b7358d2c526619437815b90ff63"><td class="mdescLeft">&#160;</td><td class="mdescRight">绕 Z 轴旋转 <a href="group__core.html#gaf0b49b7358d2c526619437815b90ff63">更多...</a><br /></td></tr>
<tr class="separator:gaf0b49b7358d2c526619437815b90ff63"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga30c7a100ec4944f281dbcd6151a54670"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga30c7a100ec4944f281dbcd6151a54670">vde::core::scale</a> (double sx, double sy, double sz)</td></tr>
<tr class="memdesc:ga30c7a100ec4944f281dbcd6151a54670"><td class="mdescLeft">&#160;</td><td class="mdescRight">创建非均匀缩放变换 <a href="group__core.html#ga30c7a100ec4944f281dbcd6151a54670">更多...</a><br /></td></tr>
<tr class="separator:ga30c7a100ec4944f281dbcd6151a54670"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga32b760d38ec52a155d40947b1293b526"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#ga32b760d38ec52a155d40947b1293b526">vde::core::scale</a> (double s)</td></tr>
<tr class="memdesc:ga32b760d38ec52a155d40947b1293b526"><td class="mdescLeft">&#160;</td><td class="mdescRight">创建均匀缩放变换 <a href="group__core.html#ga32b760d38ec52a155d40947b1293b526">更多...</a><br /></td></tr>
<tr class="separator:ga32b760d38ec52a155d40947b1293b526"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaeae68fe001afb374771a43ec52baa2fb"><td class="memItemLeft" align="right" valign="top">std::vector&lt; <a class="el" href="structvde_1_1core_1_1VoronoiCell.html">VoronoiCell</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__core.html#gaeae68fe001afb374771a43ec52baa2fb">vde::core::voronoi_2d</a> (const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#a78483c599a40e4f333418667a77e3862">Point2D</a> &gt; &amp;points)</td></tr>
<tr class="memdesc:gaeae68fe001afb374771a43ec52baa2fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">二维 Voronoi 图生成(通过 Delaunay 对偶图) <a href="group__core.html#gaeae68fe001afb374771a43ec52baa2fb">更多...</a><br /></td></tr>
<tr class="separator:gaeae68fe001afb374771a43ec52baa2fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">详细描述</h2>
<p>点/向量/变换、多边形、凸包、Voronoi、ICP、距离计算 </p>
<p>核心模块提供 VDE 引擎的几何操作 API:</p><ul>
<li>基础几何体(AABB、直线、射线、线段、平面、三角形、多边形)</li>
<li>几何计算(距离、最近点、凸包、变换)</li>
<li>点云配准(ICP</li>
<li>Voronoi 图 </li>
</ul>
<h2 class="groupheader">类型定义说明</h2>
<a id="ga1d6b7ffb62cc56245fac3b5939f0df80"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga1d6b7ffb62cc56245fac3b5939f0df80">&#9670;&nbsp;</a></span>Transform3D</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">using <a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">vde::core::Transform3D</a> = typedef Eigen::Transform&lt;double, 3, Eigen::Affine&gt;</td>
</tr>
</table>
</div><div class="memdoc">
<p>三维仿射变换类型 </p>
<p>基于 Eigen::Transform,支持平移、旋转、缩放和它们的组合。 使用 4×4 齐次矩阵表示。 </p>
<p class="definition">在文件 <a class="el" href="transform_8h_source.html">transform.h</a><a class="el" href="transform_8h_source.html#l00015">15</a> 行定义.</p>
</div>
</div>
<h2 class="groupheader">函数说明</h2>
<a id="gad6bb2e0732fc636a0e157af3646e53bc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gad6bb2e0732fc636a0e157af3646e53bc">&#9670;&nbsp;</a></span>closest_point() <span class="overload">[1/4]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> vde::core::closest_point </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">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_1core_1_1AABB.html">AABB</a>&lt; double &gt; &amp;&#160;</td>
<td class="paramname"><em>box</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>包围盒上距给定点最近的点 </p>
<p>对每个坐标分量做 clamp 到 [min, max]。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">p</td><td>查询点 </td></tr>
<tr><td class="paramname">box</td><td>包围盒 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>包围盒边界上(或内部)距离 p 最近的点 </dd></dl>
</div>
</div>
<a id="ga9ba9a9d242d667d9a257ca5b4bfbaff1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga9ba9a9d242d667d9a257ca5b4bfbaff1">&#9670;&nbsp;</a></span>closest_point() <span class="overload">[2/4]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> vde::core::closest_point </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">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_1core_1_1Plane.html">Plane</a>&lt; double &gt; &amp;&#160;</td>
<td class="paramname"><em>plane</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>平面上距给定点最近的点(正交投影) </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">p</td><td>查询点 </td></tr>
<tr><td class="paramname">plane</td><td>平面 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>点 p 在平面上的正交投影</dd></dl>
<dl class="section see"><dt>参见</dt><dd><a class="el" href="classvde_1_1core_1_1Plane.html#a55f1e4e3b11fbe2f70a95ba0700f3e07" title="点在平面上的正交投影">Plane::project</a> </dd></dl>
</div>
</div>
<a id="ga1a7cb315df51ac922d9e9d207950ec43"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga1a7cb315df51ac922d9e9d207950ec43">&#9670;&nbsp;</a></span>closest_point() <span class="overload">[3/4]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> vde::core::closest_point </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">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_1core_1_1Segment3D.html">Segment3D</a>&lt; double &gt; &amp;&#160;</td>
<td class="paramname"><em>seg</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>线段上距给定点最近的点 </p>
<p>通过参数 t = clamp(投影, 0, 1) 实现。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">p</td><td>查询点 </td></tr>
<tr><td class="paramname">seg</td><td>线段 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>线段上距离 p 最近的点(可能为端点) </dd></dl>
</div>
</div>
<a id="gadb95bcdf9ce6420abfd95eee4d465bde"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gadb95bcdf9ce6420abfd95eee4d465bde">&#9670;&nbsp;</a></span>closest_point() <span class="overload">[4/4]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> vde::core::closest_point </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">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_1core_1_1Triangle.html">Triangle</a>&lt; double &gt; &amp;&#160;</td>
<td class="paramname"><em>tri</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">p</td><td>查询点 </td></tr>
<tr><td class="paramname">tri</td><td>三角形 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>三角形上距离 p 最近的点 </dd></dl>
</div>
</div>
<a id="gaacb80a198879458b0a6e48a9e5a47da2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaacb80a198879458b0a6e48a9e5a47da2">&#9670;&nbsp;</a></span>convex_hull_2d()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::vector&lt;<a class="el" href="namespacevde_1_1core.html#a78483c599a40e4f333418667a77e3862">Point2D</a>&gt; vde::core::convex_hull_2d </td>
<td>(</td>
<td class="paramtype">const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#a78483c599a40e4f333418667a77e3862">Point2D</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>points</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>二维凸包计算(Graham Scan 算法) </p>
<p>使用 Graham 扫描算法计算点集的凸包,时间复杂度 O(n log n)。 以极角排序点为预处理,然后用栈维护凸包边界。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">points</td><td>输入点集(至少 3 个不共线点) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>凸包顶点序列(逆时针排列),不含共线的中间点</dd></dl>
<dl class="section note"><dt>注解</dt><dd>自动过滤共线点,返回严格的凸包顶点 </dd>
<dd>
若所有点共线,返回两个端点</dd></dl>
<div class="fragment"><div class="line">std::vector&lt;Point2D&gt; pts = {{0,0}, {1,0}, {1,1}, {0,1}, {0.5,0.5}};</div>
<div class="line"><span class="keyword">auto</span> hull = <a class="code" href="group__core.html#gaacb80a198879458b0a6e48a9e5a47da2">convex_hull_2d</a>(pts);</div>
<div class="line"><span class="comment">// hull = [(0,0), (1,0), (1,1), (0,1)]</span></div>
<div class="ttc" id="agroup__core_html_gaacb80a198879458b0a6e48a9e5a47da2"><div class="ttname"><a href="group__core.html#gaacb80a198879458b0a6e48a9e5a47da2">vde::core::convex_hull_2d</a></div><div class="ttdeci">std::vector&lt; Point2D &gt; convex_hull_2d(const std::vector&lt; Point2D &gt; &amp;points)</div><div class="ttdoc">二维凸包计算(Graham Scan 算法)</div></div>
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="group__core.html#ga4b65dcd970fc3b5de01d5506e326bf46" title="三维凸包计算(QuickHull 算法)">convex_hull_3d</a>, <a class="el" href="classvde_1_1core_1_1Polygon2D.html#a8eeac89881bb9b231e2c8cad55a5729c" title="Andrew&#39;s Monotone Chain 二维凸包">Polygon2D::convex_hull_2d</a> </dd></dl>
</div>
</div>
<a id="ga4b65dcd970fc3b5de01d5506e326bf46"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4b65dcd970fc3b5de01d5506e326bf46">&#9670;&nbsp;</a></span>convex_hull_3d()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::vector&lt;std::array&lt;<a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>, 3&gt; &gt; vde::core::convex_hull_3d </td>
<td>(</td>
<td class="paramtype">const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>points</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>三维凸包计算(QuickHull 算法) </p>
<p>使用 QuickHull 算法计算三维点集的凸包。 先构造初始四面体,然后递归地将外部点添加到凸包上。 平均复杂度 O(n log n),最坏情况 O(n²)。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">points</td><td>输入点集(至少 4 个不共面点) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>凸包三角形列表,每个三角形三顶点按逆时针排列(从外部观察)</dd></dl>
<dl class="section note"><dt>注解</dt><dd>返回的三角形法线方向朝外 </dd>
<dd>
共面/退化点被自动丢弃</dd></dl>
<div class="fragment"><div class="line">std::vector&lt;Point3D&gt; pts = 3D 点云;</div>
<div class="line"><span class="keyword">auto</span> hull_tris = <a class="code" href="group__core.html#ga4b65dcd970fc3b5de01d5506e326bf46">convex_hull_3d</a>(pts);</div>
<div class="line"><span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; tri : hull_tris) {</div>
<div class="line"> <span class="comment">// tri = {p0, p1, p2} — CCW when viewed from outside</span></div>
<div class="line">}</div>
<div class="ttc" id="agroup__core_html_ga4b65dcd970fc3b5de01d5506e326bf46"><div class="ttname"><a href="group__core.html#ga4b65dcd970fc3b5de01d5506e326bf46">vde::core::convex_hull_3d</a></div><div class="ttdeci">std::vector&lt; std::array&lt; Point3D, 3 &gt; &gt; convex_hull_3d(const std::vector&lt; Point3D &gt; &amp;points)</div><div class="ttdoc">三维凸包计算(QuickHull 算法)</div></div>
</div><!-- fragment --><dl class="section see"><dt>参见</dt><dd><a class="el" href="group__core.html#gaacb80a198879458b0a6e48a9e5a47da2" title="二维凸包计算(Graham Scan 算法)">convex_hull_2d</a> </dd></dl>
</div>
</div>
<a id="ga813b7b5d20316f958b43b4c5a58a4883"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga813b7b5d20316f958b43b4c5a58a4883">&#9670;&nbsp;</a></span>distance() <span class="overload">[1/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1core_1_1AABB.html">AABB</a>&lt; double &gt; &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_1AABB.html">AABB</a>&lt; double &gt; &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>若相交则返回 0。</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>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>最短距离 </dd></dl>
</div>
</div>
<a id="ga0f6b23d8527e9527668af106edd4c188"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga0f6b23d8527e9527668af106edd4c188">&#9670;&nbsp;</a></span>distance() <span class="overload">[2/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1core_1_1Line3D.html">Line3D</a>&lt; double &gt; &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_1Line3D.html">Line3D</a>&lt; double &gt; &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>若相交则为 0;若平行则返回任意垂线段长度;若异面则返回公垂线长度。</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>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>最短距离 </dd></dl>
</div>
</div>
<a id="ga8378489b455ccc35eb29dcb1a874bbd0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga8378489b455ccc35eb29dcb1a874bbd0">&#9670;&nbsp;</a></span>distance() <span class="overload">[3/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</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="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</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>
<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>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>||b - a||</dd></dl>
<div class="fragment"><div class="line"><span class="keywordtype">double</span> d = <a class="code" href="group__core.html#ga8378489b455ccc35eb29dcb1a874bbd0">distance</a>(<a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(0,0,0), <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(3,4,0)); <span class="comment">// d == 5.0</span></div>
<div class="ttc" id="agroup__core_html_ga8378489b455ccc35eb29dcb1a874bbd0"><div class="ttname"><a href="group__core.html#ga8378489b455ccc35eb29dcb1a874bbd0">vde::core::distance</a></div><div class="ttdeci">double distance(const Point3D &amp;a, const Point3D &amp;b)</div><div class="ttdoc">两点之间的欧氏距离</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><!-- fragment -->
</div>
</div>
<a id="ga47add037521cc2500a05b3630ade36f4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga47add037521cc2500a05b3630ade36f4">&#9670;&nbsp;</a></span>distance() <span class="overload">[4/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">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_1core_1_1AABB.html">AABB</a>&lt; double &gt; &amp;&#160;</td>
<td class="paramname"><em>box</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>点到包围盒的距离 </p>
<p>若点在包围盒内,返回 0;否则返回到最近面的距离。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">p</td><td>测试点 </td></tr>
<tr><td class="paramname">box</td><td>包围盒 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>最短距离(内部点返回 0 </dd></dl>
</div>
</div>
<a id="ga1bd9e26be7d281523753d2681837b92e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga1bd9e26be7d281523753d2681837b92e">&#9670;&nbsp;</a></span>distance() <span class="overload">[5/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">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_1core_1_1Line3D.html">Line3D</a>&lt; double &gt; &amp;&#160;</td>
<td class="paramname"><em>line</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">p</td><td>测试点 </td></tr>
<tr><td class="paramname">line</td><td>直线 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>垂直距离 </dd></dl>
</div>
</div>
<a id="ga4a05820313877ebc46d972465a448e52"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4a05820313877ebc46d972465a448e52">&#9670;&nbsp;</a></span>distance() <span class="overload">[6/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">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_1core_1_1Plane.html">Plane</a>&lt; double &gt; &amp;&#160;</td>
<td class="paramname"><em>plane</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">p</td><td>测试点 </td></tr>
<tr><td class="paramname">plane</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="classvde_1_1core_1_1Plane.html#a504b11de876d56076272afd0b6d60d8d" title="有向点到平面距离">Plane::signed_distance</a> </dd></dl>
</div>
</div>
<a id="ga7468571f81e61ca34a4b34f16b33dfab"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga7468571f81e61ca34a4b34f16b33dfab">&#9670;&nbsp;</a></span>distance() <span class="overload">[7/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">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_1core_1_1Segment3D.html">Segment3D</a>&lt; double &gt; &amp;&#160;</td>
<td class="paramname"><em>seg</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">p</td><td>测试点 </td></tr>
<tr><td class="paramname">seg</td><td>线段 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>最短距离 </dd></dl>
</div>
</div>
<a id="ga60c1aaba85c90f7e0f1090a3a8fff099"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga60c1aaba85c90f7e0f1090a3a8fff099">&#9670;&nbsp;</a></span>distance() <span class="overload">[8/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">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_1core_1_1Triangle.html">Triangle</a>&lt; double &gt; &amp;&#160;</td>
<td class="paramname"><em>tri</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">p</td><td>测试点 </td></tr>
<tr><td class="paramname">tri</td><td>三角形 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>最短距离 </dd></dl>
</div>
</div>
<a id="ga1d6b1a31af4a149f94e89235d4159f06"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga1d6b1a31af4a149f94e89235d4159f06">&#9670;&nbsp;</a></span>distance() <span class="overload">[9/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1core_1_1Segment3D.html">Segment3D</a>&lt; double &gt; &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_1Segment3D.html">Segment3D</a>&lt; double &gt; &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>第一条线段 </td></tr>
<tr><td class="paramname">b</td><td>第二条线段 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>最短距离(若相交则为 0 </dd></dl>
</div>
</div>
<a id="gaa22348c98076275fa470fb309c495b07"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa22348c98076275fa470fb309c495b07">&#9670;&nbsp;</a></span>distance() <span class="overload">[10/10]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double vde::core::distance </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="classvde_1_1core_1_1Triangle.html">Triangle</a>&lt; double &gt; &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_1Triangle.html">Triangle</a>&lt; double &gt; &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>第一个三角形 </td></tr>
<tr><td class="paramname">b</td><td>第二个三角形 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>最短距离(若相交则为 0 </dd></dl>
</div>
</div>
<a id="gabaf3dea80baf0c0ef81e5de25841e8e0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gabaf3dea80baf0c0ef81e5de25841e8e0">&#9670;&nbsp;</a></span>icp_register()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="structvde_1_1core_1_1ICPResult.html">ICPResult</a> vde::core::icp_register </td>
<td>(</td>
<td class="paramtype">const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>source</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>target</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>max_iter</em> = <code>50</code>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>tolerance</em> = <code>1e-6</code>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>迭代最近点(ICP)刚体点云配准 </p>
<p>使用标准 ICP 算法将 source 点云配准到 target 点云。 每步迭代:</p><ol type="1">
<li>对每个 source 点找 target 中的最近邻</li>
<li>用 SVD 求解最优刚体变换</li>
<li>应用变换,检查收敛</li>
</ol>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">source</td><td>源点云(将被移动) </td></tr>
<tr><td class="paramname">target</td><td>目标点云(固定参考) </td></tr>
<tr><td class="paramname">max_iter</td><td>最大迭代次数(默认 50 </td></tr>
<tr><td class="paramname">tolerance</td><td>收敛容差:相邻两次 RMS 变化的阈值(默认 1e-6) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>配准结果,包含最终变换和误差</dd></dl>
<dl class="section note"><dt>注解</dt><dd>source 和 target 点数可以不同 </dd>
<dd>
初始对齐越好,收敛越快;若初始偏差太大,可能收敛到局部最优</dd></dl>
<div class="fragment"><div class="line">std::vector&lt;Point3D&gt; src = <span class="comment">// ...;</span></div>
<div class="line">std::vector&lt;Point3D&gt; tgt = <span class="comment">// ...;</span></div>
<div class="line"><span class="keyword">auto</span> result = <a class="code" href="group__core.html#gabaf3dea80baf0c0ef81e5de25841e8e0">icp_register</a>(src, tgt, 100, 1e-8);</div>
<div class="line"><span class="keywordflow">if</span> (result.converged) {</div>
<div class="line"> std::cout &lt;&lt; <span class="stringliteral">&quot;RMS error: &quot;</span> &lt;&lt; result.rms_error &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div>
<div class="line"> <span class="comment">// 应用变换</span></div>
<div class="line"> <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; p : src) p = result.transform * p;</div>
<div class="line">}</div>
<div class="ttc" id="agroup__core_html_gabaf3dea80baf0c0ef81e5de25841e8e0"><div class="ttname"><a href="group__core.html#gabaf3dea80baf0c0ef81e5de25841e8e0">vde::core::icp_register</a></div><div class="ttdeci">ICPResult icp_register(const std::vector&lt; Point3D &gt; &amp;source, const std::vector&lt; Point3D &gt; &amp;target, int max_iter=50, double tolerance=1e-6)</div><div class="ttdoc">迭代最近点(ICP)刚体点云配准</div></div>
</div><!-- fragment -->
</div>
</div>
<a id="gaa8821904ace09771bb66a626ecbdb3fb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa8821904ace09771bb66a626ecbdb3fb">&#9670;&nbsp;</a></span>rotate()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a> vde::core::rotate </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a> &amp;&#160;</td>
<td class="paramname"><em>axis</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>angle_rad</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>创建旋转变换(轴-角表示) </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">axis</td><td>旋转轴(自动归一化) </td></tr>
<tr><td class="paramname">angle_rad</td><td>旋转角度(弧度) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>旋转变换矩阵</dd></dl>
<div class="fragment"><div class="line"><span class="comment">// 绕 Z 轴旋转 90°</span></div>
<div class="line"><span class="keyword">auto</span> R = <a class="code" href="group__core.html#gaa8821904ace09771bb66a626ecbdb3fb">rotate</a>(Vector3D::UnitZ(), M_PI / 2);</div>
<div class="ttc" id="agroup__core_html_gaa8821904ace09771bb66a626ecbdb3fb"><div class="ttname"><a href="group__core.html#gaa8821904ace09771bb66a626ecbdb3fb">vde::core::rotate</a></div><div class="ttdeci">Transform3D rotate(const Vector3D &amp;axis, double angle_rad)</div><div class="ttdoc">创建旋转变换(轴-角表示)</div><div class="ttdef"><b>Definition:</b> <a href="transform_8h_source.html#l00062">transform.h:62</a></div></div>
</div><!-- fragment -->
<p class="definition">在文件 <a class="el" href="transform_8h_source.html">transform.h</a><a class="el" href="transform_8h_source.html#l00062">62</a> 行定义.</p>
<p class="reference">被这些函数引用 <a class="el" href="transform_8h_source.html#l00074">vde::core::rotate_x()</a>, <a class="el" href="transform_8h_source.html#l00084">vde::core::rotate_y()</a> , 以及 <a class="el" href="transform_8h_source.html#l00094">vde::core::rotate_z()</a>.</p>
</div>
</div>
<a id="ga81af7f4bc18bd5159a2f10d661af320f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga81af7f4bc18bd5159a2f10d661af320f">&#9670;&nbsp;</a></span>rotate_x()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a> vde::core::rotate_x </td>
<td>(</td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>rad</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>绕 X 轴旋转 </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">rad</td><td>旋转角度(弧度) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>旋转变换矩阵 </dd></dl>
<p class="definition">在文件 <a class="el" href="transform_8h_source.html">transform.h</a><a class="el" href="transform_8h_source.html#l00074">74</a> 行定义.</p>
<p class="reference">引用了 <a class="el" href="transform_8h_source.html#l00062">vde::core::rotate()</a>.</p>
</div>
</div>
<a id="gae14e5be60107581d9b2af2fb2b43e711"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gae14e5be60107581d9b2af2fb2b43e711">&#9670;&nbsp;</a></span>rotate_y()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a> vde::core::rotate_y </td>
<td>(</td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>rad</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>绕 Y 轴旋转 </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">rad</td><td>旋转角度(弧度) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>旋转变换矩阵 </dd></dl>
<p class="definition">在文件 <a class="el" href="transform_8h_source.html">transform.h</a><a class="el" href="transform_8h_source.html#l00084">84</a> 行定义.</p>
<p class="reference">引用了 <a class="el" href="transform_8h_source.html#l00062">vde::core::rotate()</a>.</p>
</div>
</div>
<a id="gaf0b49b7358d2c526619437815b90ff63"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaf0b49b7358d2c526619437815b90ff63">&#9670;&nbsp;</a></span>rotate_z()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a> vde::core::rotate_z </td>
<td>(</td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>rad</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>绕 Z 轴旋转 </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">rad</td><td>旋转角度(弧度) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>旋转变换矩阵 </dd></dl>
<p class="definition">在文件 <a class="el" href="transform_8h_source.html">transform.h</a><a class="el" href="transform_8h_source.html#l00094">94</a> 行定义.</p>
<p class="reference">引用了 <a class="el" href="transform_8h_source.html#l00062">vde::core::rotate()</a>.</p>
</div>
</div>
<a id="ga32b760d38ec52a155d40947b1293b526"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga32b760d38ec52a155d40947b1293b526">&#9670;&nbsp;</a></span>scale() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a> vde::core::scale </td>
<td>(</td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>s</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>创建均匀缩放变换 </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">s</td><td>各方向统一的缩放因子 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>缩放变换矩阵 </dd></dl>
<p class="definition">在文件 <a class="el" href="transform_8h_source.html">transform.h</a><a class="el" href="transform_8h_source.html#l00120">120</a> 行定义.</p>
<p class="reference">引用了 <a class="el" href="transform_8h_source.html#l00108">vde::core::scale()</a>.</p>
</div>
</div>
<a id="ga30c7a100ec4944f281dbcd6151a54670"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga30c7a100ec4944f281dbcd6151a54670">&#9670;&nbsp;</a></span>scale() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a> vde::core::scale </td>
<td>(</td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>sx</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>sy</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>sz</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>创建非均匀缩放变换 </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">sx</td><td>X 方向缩放因子 </td></tr>
<tr><td class="paramname">sy</td><td>Y 方向缩放因子 </td></tr>
<tr><td class="paramname">sz</td><td>Z 方向缩放因子 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>缩放变换矩阵</dd></dl>
<dl class="section note"><dt>注解</dt><dd>非均匀缩放可能导致法线方向不准确;使用场景中应考虑法线变换 = (M^{-1})^T </dd></dl>
<p class="definition">在文件 <a class="el" href="transform_8h_source.html">transform.h</a><a class="el" href="transform_8h_source.html#l00108">108</a> 行定义.</p>
<p class="reference">被这些函数引用 <a class="el" href="transform_8h_source.html#l00120">vde::core::scale()</a>.</p>
</div>
</div>
<a id="gac8fbd42a8dac9187eef97b9a393f948b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gac8fbd42a8dac9187eef97b9a393f948b">&#9670;&nbsp;</a></span>translate() <span class="overload">[1/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a> vde::core::translate </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a> &amp;&#160;</td>
<td class="paramname"><em>v</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>创建平移变换 </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">v</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> T = <a class="code" href="group__core.html#gac8fbd42a8dac9187eef97b9a393f948b">translate</a>(<a class="code" href="namespacevde_1_1core.html#ab763c018d19e10e91a6c6d6ab2ccc8e0">Vector3D</a>(1, 2, 3));</div>
<div class="line"><a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a> p2 = T * <a class="code" href="namespacevde_1_1core.html#ac6aed70c4b90d13f10217267cd7a1952">Point3D</a>(0,0,0); <span class="comment">// p2 == (1,2,3)</span></div>
<div class="ttc" id="agroup__core_html_gac8fbd42a8dac9187eef97b9a393f948b"><div class="ttname"><a href="group__core.html#gac8fbd42a8dac9187eef97b9a393f948b">vde::core::translate</a></div><div class="ttdeci">Transform3D translate(const Vector3D &amp;v)</div><div class="ttdoc">创建平移变换</div><div class="ttdef"><b>Definition:</b> <a href="transform_8h_source.html#l00030">transform.h:30</a></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><!-- fragment -->
<p class="definition">在文件 <a class="el" href="transform_8h_source.html">transform.h</a><a class="el" href="transform_8h_source.html#l00030">30</a> 行定义.</p>
<p class="reference">被这些函数引用 <a class="el" href="transform_8h_source.html#l00044">vde::core::translate()</a>.</p>
</div>
</div>
<a id="ga938b1dfb9688f3b94b88a219c0e69aec"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga938b1dfb9688f3b94b88a219c0e69aec">&#9670;&nbsp;</a></span>translate() <span class="overload">[2/2]</span></h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__core.html#ga1d6b7ffb62cc56245fac3b5939f0df80">Transform3D</a> vde::core::translate </td>
<td>(</td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>x</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>y</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>z</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">inline</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>创建平移变换(分量形式) </p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">x</td><td>X 方向位移 </td></tr>
<tr><td class="paramname">y</td><td>Y 方向位移 </td></tr>
<tr><td class="paramname">z</td><td>Z 方向位移 </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>平移变换矩阵 </dd></dl>
<p class="definition">在文件 <a class="el" href="transform_8h_source.html">transform.h</a><a class="el" href="transform_8h_source.html#l00044">44</a> 行定义.</p>
<p class="reference">引用了 <a class="el" href="transform_8h_source.html#l00030">vde::core::translate()</a>.</p>
</div>
</div>
<a id="gaeae68fe001afb374771a43ec52baa2fb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaeae68fe001afb374771a43ec52baa2fb">&#9670;&nbsp;</a></span>voronoi_2d()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">std::vector&lt;<a class="el" href="structvde_1_1core_1_1VoronoiCell.html">VoronoiCell</a>&gt; vde::core::voronoi_2d </td>
<td>(</td>
<td class="paramtype">const std::vector&lt; <a class="el" href="namespacevde_1_1core.html#a78483c599a40e4f333418667a77e3862">Point2D</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>points</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>二维 Voronoi 图生成(通过 Delaunay 对偶图) </p>
<p>从输入点集的 Delaunay 三角剖分构造其对偶 Voronoi 图。 每个输入点对应一个 VoronoiCell。</p>
<dl class="params"><dt>参数</dt><dd>
<table class="params">
<tr><td class="paramname">points</td><td>输入点集(站点) </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>返回</dt><dd>每个站点对应的 <a class="el" href="structvde_1_1core_1_1VoronoiCell.html" title="Voronoi 单元格">VoronoiCell</a> 列表(顺序与输入一致)</dd></dl>
<dl class="section note"><dt>注解</dt><dd>对于凸包边界上的站点,对应的 Voronoi 单元格无界,顶点不完全闭合 </dd>
<dd>
内部使用 Delaunay 三角剖分作为中间步骤</dd></dl>
<div class="fragment"><div class="line">std::vector&lt;Point2D&gt; sites = {{0,0}, {1,0}, {0,1}, {1,1}};</div>
<div class="line"><span class="keyword">auto</span> cells = <a class="code" href="group__core.html#gaeae68fe001afb374771a43ec52baa2fb">voronoi_2d</a>(sites);</div>
<div class="line"><span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; cell : cells) {</div>
<div class="line"> std::cout &lt;&lt; <span class="stringliteral">&quot;Site: &quot;</span> &lt;&lt; cell.site.transpose() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div>
<div class="line"> std::cout &lt;&lt; <span class="stringliteral">&quot; Vertices: &quot;</span> &lt;&lt; cell.vertices.size() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div>
<div class="line">}</div>
<div class="ttc" id="agroup__core_html_gaeae68fe001afb374771a43ec52baa2fb"><div class="ttname"><a href="group__core.html#gaeae68fe001afb374771a43ec52baa2fb">vde::core::voronoi_2d</a></div><div class="ttdeci">std::vector&lt; VoronoiCell &gt; voronoi_2d(const std::vector&lt; Point2D &gt; &amp;points)</div><div class="ttdoc">二维 Voronoi 图生成(通过 Delaunay 对偶图)</div></div>
</div><!-- fragment -->
</div>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">生成于 2026年 七月 24日 星期五 11:21:23 , 为 ViewDesignEngine使用 <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1 </li>
</ul>
</div>
</body>
</html>