52 std::vector<int> chIdx;
53 if (picks.isEmpty()) {
54 for (
int i = 0; i < info.
chs.size(); ++i) {
58 for (
int i = 0; i < info.
chs.size(); ++i) {
59 if (picks.contains(info.
chs[i].ch_name)) {
65 const int nCh =
static_cast<int>(chIdx.size());
67 return SparseMatrix<int>(0, 0);
72 for (
int i = 0; i < nCh; ++i) {
73 const Vector3f& r0 = info.
chs[chIdx[i]].chpos.r0;
74 pos(i, 0) =
static_cast<double>(r0(0));
75 pos(i, 1) =
static_cast<double>(r0(1));
76 pos(i, 2) =
static_cast<double>(r0(2));
80 std::vector<double> nnDist(nCh, std::numeric_limits<double>::max());
81 MatrixXd distMat(nCh, nCh);
82 for (
int i = 0; i < nCh; ++i) {
84 for (
int j = i + 1; j < nCh; ++j) {
85 double d = (pos.row(i) - pos.row(j)).norm();
96 std::vector<double> sortedNN = nnDist;
97 std::sort(sortedNN.begin(), sortedNN.end());
100 medianNN = (sortedNN[nCh / 2 - 1] + sortedNN[nCh / 2]) / 2.0;
102 medianNN = sortedNN[nCh / 2];
105 double threshold = 3.0 * medianNN;
108 std::vector<Triplet<int>> triplets;
109 for (
int i = 0; i < nCh; ++i) {
110 for (
int j = i + 1; j < nCh; ++j) {
111 if (distMat(i, j) <= threshold) {
112 triplets.emplace_back(i, j, 1);
113 triplets.emplace_back(j, i, 1);
118 SparseMatrix<int> adj(nCh, nCh);
119 adj.setFromTriplets(triplets.begin(), triplets.end());
127 std::vector<Triplet<int>> triplets;
129 for (
int t = 0; t < tris.rows(); ++t) {
135 triplets.emplace_back(v0, v1, 1);
136 triplets.emplace_back(v1, v0, 1);
137 triplets.emplace_back(v0, v2, 1);
138 triplets.emplace_back(v2, v0, 1);
139 triplets.emplace_back(v1, v2, 1);
140 triplets.emplace_back(v2, v1, 1);
143 SparseMatrix<int> adj(nVertices, nVertices);
144 adj.setFromTriplets(triplets.begin(), triplets.end());
151 const MatrixX3i& tris,
int nVertices,
int nTimes)
156 const int nTotal = nVertices * nTimes;
157 std::vector<Triplet<int>> triplets;
160 triplets.reserve(
static_cast<size_t>(spatialAdj.nonZeros()) * nTimes +
static_cast<size_t>(nVertices) * (nTimes - 1) * 2);
164 for (
int t = 0; t < nTimes; ++t) {
165 for (
int k = 0; k < spatialAdj.outerSize(); ++k) {
166 for (SparseMatrix<int>::InnerIterator it(spatialAdj, k); it; ++it) {
167 int row =
static_cast<int>(it.row()) * nTimes + t;
168 int col =
static_cast<int>(it.col()) * nTimes + t;
169 triplets.emplace_back(row, col, 1);
175 for (
int v = 0; v < nVertices; ++v) {
176 for (
int t = 0; t < nTimes - 1; ++t) {
177 int idx0 = v * nTimes + t;
178 int idx1 = v * nTimes + t + 1;
179 triplets.emplace_back(idx0, idx1, 1);
180 triplets.emplace_back(idx1, idx0, 1);
184 SparseMatrix<int> adj(nTotal, nTotal);
185 adj.setFromTriplets(triplets.begin(), triplets.end());