62 std::vector<int> chIdx;
63 if (picks.isEmpty()) {
64 for (
int i = 0; i < info.
chs.size(); ++i) {
68 for (
int i = 0; i < info.
chs.size(); ++i) {
69 if (picks.contains(info.
chs[i].ch_name)) {
75 const int nCh =
static_cast<int>(chIdx.size());
77 return SparseMatrix<int>(0, 0);
82 for (
int i = 0; i < nCh; ++i) {
83 const Vector3f& r0 = info.
chs[chIdx[i]].chpos.r0;
84 pos(i, 0) =
static_cast<double>(r0(0));
85 pos(i, 1) =
static_cast<double>(r0(1));
86 pos(i, 2) =
static_cast<double>(r0(2));
90 std::vector<double> nnDist(nCh, std::numeric_limits<double>::max());
91 MatrixXd distMat(nCh, nCh);
92 for (
int i = 0; i < nCh; ++i) {
94 for (
int j = i + 1; j < nCh; ++j) {
95 double d = (pos.row(i) - pos.row(j)).norm();
98 if (d < nnDist[i]) nnDist[i] = d;
99 if (d < nnDist[j]) nnDist[j] = d;
104 std::vector<double> sortedNN = nnDist;
105 std::sort(sortedNN.begin(), sortedNN.end());
108 medianNN = (sortedNN[nCh / 2 - 1] + sortedNN[nCh / 2]) / 2.0;
110 medianNN = sortedNN[nCh / 2];
113 double threshold = 3.0 * medianNN;
116 std::vector<Triplet<int>> triplets;
117 for (
int i = 0; i < nCh; ++i) {
118 for (
int j = i + 1; j < nCh; ++j) {
119 if (distMat(i, j) <= threshold) {
120 triplets.emplace_back(i, j, 1);
121 triplets.emplace_back(j, i, 1);
126 SparseMatrix<int> adj(nCh, nCh);
127 adj.setFromTriplets(triplets.begin(), triplets.end());
135 std::vector<Triplet<int>> triplets;
137 for (
int t = 0; t < tris.rows(); ++t) {
143 triplets.emplace_back(v0, v1, 1);
144 triplets.emplace_back(v1, v0, 1);
145 triplets.emplace_back(v0, v2, 1);
146 triplets.emplace_back(v2, v0, 1);
147 triplets.emplace_back(v1, v2, 1);
148 triplets.emplace_back(v2, v1, 1);
151 SparseMatrix<int> adj(nVertices, nVertices);
152 adj.setFromTriplets(triplets.begin(), triplets.end());
159 const MatrixX3i& tris,
int nVertices,
int nTimes)
164 const int nTotal = nVertices * nTimes;
165 std::vector<Triplet<int>> triplets;
168 triplets.reserve(
static_cast<size_t>(spatialAdj.nonZeros()) * nTimes
169 +
static_cast<size_t>(nVertices) * (nTimes - 1) * 2);
173 for (
int t = 0; t < nTimes; ++t) {
174 for (
int k = 0; k < spatialAdj.outerSize(); ++k) {
175 for (SparseMatrix<int>::InnerIterator it(spatialAdj, k); it; ++it) {
176 int row =
static_cast<int>(it.row()) * nTimes + t;
177 int col =
static_cast<int>(it.col()) * nTimes + t;
178 triplets.emplace_back(row, col, 1);
184 for (
int v = 0; v < nVertices; ++v) {
185 for (
int t = 0; t < nTimes - 1; ++t) {
186 int idx0 = v * nTimes + t;
187 int idx1 = v * nTimes + t + 1;
188 triplets.emplace_back(idx0, idx1, 1);
189 triplets.emplace_back(idx1, idx0, 1);
193 SparseMatrix<int> adj(nTotal, nTotal);
194 adj.setFromTriplets(triplets.begin(), triplets.end());