RSMesh 1.0.0
一个曲面重构的系统,输入为点云,输出为obj,stl等主流格式的网格文件,使用的方法为径向基函数插值,采取了并行优化、Intel-MKL等优化措施,支持百万级别的点云
载入中...
搜索中...
未找到
domain.cpp
1//
2// Created by RainSure on 2024/2/18.
3//
4
5#include "preconditioner/domain.h"
6#include "Eigen/Core"
7#include "common/zip_sort.h"
8#include <algorithm>
9#include <iterator>
10
11namespace rsmesh::preconditioner {
12 index_t domain::size() const { return static_cast<index_t>(point_indices.size()); }
13
14 index_t domain::grad_size() const { return static_cast<index_t>(grad_point_indices.size()); }
15
16 index_t domain::mixed_size() const { return size() + grad_size(); }
17
18 void domain::merge_poly_points(const std::vector<index_t>& poly_point_idcs) {
19 common::zip_sort(point_indices.begin(), point_indices.end(), inner_point.begin(),
20 inner_point.end(),
21 [](const auto& a, const auto& b) { return a.first < b.first; });
22
23 auto n_poly_points = static_cast<index_t>(poly_point_idcs.size());
24 std::vector<index_t> new_point_indices(poly_point_idcs);
25 std::vector<bool> new_inner_point(n_poly_points);
26
27 for (index_t i = 0; i < n_poly_points; i++) {
28 auto idx = poly_point_idcs.at(i);
29 auto it = std::lower_bound(point_indices.begin(), point_indices.end(), idx);
30 if (it == point_indices.end() || *it != idx) {
31 continue;
32 }
33
34 auto it_inner = inner_point.begin() + std::distance(point_indices.begin(), it);
35 new_inner_point.at(i) = *it_inner;
36
37 point_indices.erase(it);
38 inner_point.erase(it_inner);
39 }
40
41 new_point_indices.insert(new_point_indices.end(), point_indices.begin(), point_indices.end());
42 new_inner_point.insert(new_inner_point.end(), inner_point.begin(), inner_point.end());
43
44 point_indices = new_point_indices;
45 inner_point = new_inner_point;
46 }
47}
该命名空间下主要定义了关于krylov子空间方法的预处理相关的类和函数