38 const QVector<IeegContact>& contacts = implantation.
contacts();
39 QVector<IeegBipolarPair> pairs;
40 auto add = [&](
int anode,
int cathode) {
41 const Eigen::Vector3f& a = contacts[anode].position;
42 const Eigen::Vector3f& c = contacts[cathode].position;
45 pairs.append({anode, cathode, contacts[anode].name + QLatin1Char(
'-') + contacts[cathode].name, (a + c) * 0.5f});
49 const QVector<int>& order = lead.contacts;
50 const bool grid = lead.type ==
IeegLeadType::Grid && qint64(lead.rows) * lead.cols == order.size() && lead.cols > 0;
51 const int cols = grid ? lead.cols : int(order.size());
53 for (
int k = 0; k + 1 < order.size(); ++k) {
54 if ((k + 1) % cols != 0)
55 add(order[k], order[k + 1]);
59 for (
int k = 0; k + cols < order.size(); ++k)
60 add(order[k], order[k + cols]);
70 std::vector<Eigen::Triplet<double>> entries;
71 entries.reserve(
size_t(pairs.size()) * 2);
72 for (
int p = 0; p < pairs.size(); ++p) {
73 entries.emplace_back(p, pairs[p].anode, 1.0);
74 entries.emplace_back(p, pairs[p].cathode, -1.0);
76 Eigen::SparseMatrix<double> montage(pairs.size(), contactCount);
77 montage.setFromTriplets(entries.begin(), entries.end());