---
title: "GPT理解"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/gpt-conceptual-understanding/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/08-图形学与三维重构/GPT理解.md"
content_hash: 05f73c11f816258787c1f5addbbb8eca7402c235bd5e06e984c0dd701b6e6b4b
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# GPT理解

> 创建时间：2020/5/26 23:38

## 贪婪投影算法原理英文翻译

贪婪投影算法原理是：通过控制一系列点列表（边缘点）能使网格生长，并将其向外扩展直到所有可能的点被连接。局部三角化是通过沿点的法向映射点的局部领域点，并连接未连接点。
该算法是基于增量表面生长原理，遵循贪婪类型方法。该算法首先创建一个初始三角形，并继续添加新的三角形，直到考虑了点云中的所有点，或者没有更多地有效三角形可以连接到网格中。
算法流程：
1、 最近邻搜索：对于点云中的每个点“P”，选择k-领域；
通过再半径为r的球内搜索参考点的最近k-领域来创建点p的领域。半径r定义为u*d，其中d是点p和最近领域的距离；u是用户考虑点云密度的自定义常数。
为了找到点云中给定点的最近邻居，使用了Kd-tree最近邻搜索。
依据点云三角化算法过程中的交互作用，点云中的点被标记为多种状态：自由、边缘、边界和完成。
a） 首先，点云中所有的点都处于“自由”状态，自由点被定义为没有邻接三角形的点；
b） 当一个点的所有邻接三角形都被确定了，则该点标记为“完成”；
c） 当一个点被选为参考点但由于最大允许角度参数约束而具有一些缺失三角形时，它被称为边界点；
d） 边缘点是指未被选择作为参考点的点。
2、 使用切平面的领域投影：领域投影再一个平面上，该平面与领域形成的表面大致相切，并在p周围排序。
3、 修剪：通过可见性和距离标准修建点，并通过边连接到p和连续点，形成满足具有最大角度标准和可选的最小角度标准的三角形。点云修剪依赖于很多标准
a) 按距离修剪：使用kd-tree搜索候选邻近点在当前参考点的空间领域中；
b) 位于参考点影响中心球半径之外的其他点是不能作为候选点。所选择的领域点被称为候选点；
c) 投影平面的选择：应用距离标准获得的候选点集投影到近似切平面；
d) 角度排序：以参考点为原点定义新的局部坐标系，前一步的投影平面作为xy平面；候选点集中的所有点都投影到这个平面，点基于局部坐标系的x轴与从原点到投影候选点的角度排序
e) 可见性：丢弃可能形成自相交网格的点。算法定义了两种边缘类型来检查这种情况；
I 边界边：仅有一个相邻三角形的边，这些边连接“边缘”点或者“边界”点；
II 内部边：连接“完成”点与其他任何点；
使用参考点、候选点集和边界边投影平面。在这种情况下，从参考点到候选点的光线被边遮挡，则该点为不可见。

参考文献：
Navpreet Kaur Pawar 2013
Gopi, M. & Krishnan, S. 2000
后续将继续更新。

## 关于mu_和search_radius

### 源码

const double sqr_mu = mu_*mu_;
const double sqr_max_edge = search_radius_*search_radius_;

//距离门槛
double sqr_dist_threshold = (std::min)(sqr_max_edge, sqr_mu * sqrDists[1]);//sqr_mu * sqr_avg_conn_dist);

// Variables to hold the results of nearest neighbor searches
std::vector nnIdx (nnn_);
std::vector sqrDists (nnn_);

### Doc

![Alt text](/media/50d8dc836455a857fb5a.png)

  * setMu()

Set the multiplier of the nearest neighbor distance to obtain the final search radius for each point (this will make the algorithm adapt to different point densities in the cloud).

  * mu_
The nearest neighbor distance multiplier to obtain the final search radius.

最邻近点距离的乘子
用于确定每个点的最终的搜索半径

![Alt text](/media/eb79b460d523e9745700.png)

  * setSearchRadius()
Set the sphere radius that is to be used for determining the k-nearest neighbors used for triangulating.

  * search_radius_
The nearest neighbors search radius for each point and the maximum edge length.

表示对每个点最邻近搜索的半径
又该距离限制重建的网格模型面片的最大边长

const double sqr_max_edge = search_radius_*search_radius_;

//距离门槛
double sqr_dist_threshold = (std::min)(sqr_max_edge, sqr_mu * sqrDists[1]);//sqr_mu * sqr_avg_conn_dist);//sqr_mu * sqr_avg_conn_dist);

由该代码可知，距离门槛search_radius_和sqr_mu * sqrDists[1]当中较小的一个
前者由用户设定
后者由用户设定的mu值与点云平均距离的乘积确定

search_radius_ 在最近邻搜索前设置，搜索时发挥作用
mu_ 在搜索完，进行剔除时发挥所用（利用搜索的结果，获取平均距离值，进行相称）

根据文档可知，

### 博客

gp3.setSearchRadius (1.5f); //设置连接点之间的最大距离（最大边长）用于确定k近邻的球半径【默认值 0】
gp3.setMu (2.5f); //设置最近邻距离的乘子，以得到每个点的最终搜索半径【默认值 0】
