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();
88 if (d < nnDist[i]) nnDist[i] = d;
89 if (d < nnDist[j]) nnDist[j] = d;
94 std::vector<double> sortedNN = nnDist;
95 std::sort(sortedNN.begin(), sortedNN.end());
98 medianNN = (sortedNN[nCh / 2 - 1] + sortedNN[nCh / 2]) / 2.0;
100 medianNN = sortedNN[nCh / 2];
103 double threshold = 3.0 * medianNN;
106 std::vector<Triplet<int>> triplets;
107 for (
int i = 0; i < nCh; ++i) {
108 for (
int j = i + 1; j < nCh; ++j) {
109 if (distMat(i, j) <= threshold) {
110 triplets.emplace_back(i, j, 1);
111 triplets.emplace_back(j, i, 1);
116 SparseMatrix<int> adj(nCh, nCh);
117 adj.setFromTriplets(triplets.begin(), triplets.end());
125 std::vector<Triplet<int>> triplets;
127 for (
int t = 0; t < tris.rows(); ++t) {
133 triplets.emplace_back(v0, v1, 1);
134 triplets.emplace_back(v1, v0, 1);
135 triplets.emplace_back(v0, v2, 1);
136 triplets.emplace_back(v2, v0, 1);
137 triplets.emplace_back(v1, v2, 1);
138 triplets.emplace_back(v2, v1, 1);
141 SparseMatrix<int> adj(nVertices, nVertices);
142 adj.setFromTriplets(triplets.begin(), triplets.end());
149 const MatrixX3i& tris,
int nVertices,
int nTimes)
154 const int nTotal = nVertices * nTimes;
155 std::vector<Triplet<int>> triplets;
158 triplets.reserve(
static_cast<size_t>(spatialAdj.nonZeros()) * nTimes
159 +
static_cast<size_t>(nVertices) * (nTimes - 1) * 2);
163 for (
int t = 0; t < nTimes; ++t) {
164 for (
int k = 0; k < spatialAdj.outerSize(); ++k) {
165 for (SparseMatrix<int>::InnerIterator it(spatialAdj, k); it; ++it) {
166 int row =
static_cast<int>(it.row()) * nTimes + t;
167 int col =
static_cast<int>(it.col()) * nTimes + t;
168 triplets.emplace_back(row, col, 1);
174 for (
int v = 0; v < nVertices; ++v) {
175 for (
int t = 0; t < nTimes - 1; ++t) {
176 int idx0 = v * nTimes + t;
177 int idx1 = v * nTimes + t + 1;
178 triplets.emplace_back(idx0, idx1, 1);
179 triplets.emplace_back(idx1, idx0, 1);
183 SparseMatrix<int> adj(nTotal, nTotal);
184 adj.setFromTriplets(triplets.begin(), triplets.end());