27 Base::addLocalNeighbor(w, localQ, attributes, dw);
29 Matrix d2w = Matrix::Zero();
31 if (Base::isScaleDer())
32 d2w(0, 0) = Base::getNeighborFilter().scaled2w(attributes.pos(), attributes);
34 if (Base::isSpaceDer())
35 d2w.template bottomRightCorner<Dim, Dim>() = Base::getNeighborFilter().spaced2w(attributes.pos(), attributes);
37 if (Base::isScaleDer() && Base::isSpaceDer())
39 d2w.template bottomLeftCorner<Dim, 1>() = Base::getNeighborFilter().scaleSpaced2w(attributes.pos(), attributes);
40 d2w.template topRightCorner<1, Dim>() = d2w.template bottomLeftCorner<Dim, 1>().transpose();
43 m_d2SumDotPN += d2w * attributes.normal().dot(localQ);
44 m_d2SumDotPP += d2w * localQ.squaredNorm();
47 for (
int i = 0; i < Dim; ++i)
49 m_d2SumP.template block<DerDim, DerDim>(0, i * DerDim) += d2w * localQ[i];
50 m_d2SumN.template block<DerDim, DerDim>(0, i * DerDim) += d2w * attributes.normal()[i];
61 Matrix sumdSumPdSumN = Matrix::Zero();
62 Matrix sumd2SumPdSumN = Matrix::Zero();
63 Matrix sumd2SumNdSumP = Matrix::Zero();
64 Matrix sumdSumPdSumP = Matrix::Zero();
65 Matrix sumd2SumPdSumP = Matrix::Zero();
67 for (
int i = 0; i < Dim; ++i)
69 sumdSumPdSumN += Base::m_dSumN.row(i).transpose() * Base::m_dSumP.row(i);
70 sumd2SumPdSumN += m_d2SumP.template block<DerDim, DerDim>(0, i * DerDim) * Base::m_sumN(i);
71 sumd2SumNdSumP += m_d2SumN.template block<DerDim, DerDim>(0, i * DerDim) * Base::m_sumP(i);
72 sumdSumPdSumP += Base::m_dSumP.row(i).transpose() * Base::m_dSumP.row(i);
73 sumd2SumPdSumP += m_d2SumP.template block<DerDim, DerDim>(0, i * DerDim) * Base::m_sumP(i);
80 invSumW * invSumW * invSumW * invSumW *
81 (Base::getWeightSum() * Base::getWeightSum() *
82 (Base::getWeightSum() *
83 (sumdSumPdSumN + sumdSumPdSumN.transpose() + sumd2SumPdSumN + sumd2SumNdSumP) +
84 Base::m_dSumW.transpose() *
85 (Base::m_sumN.transpose() * Base::m_dSumP + Base::m_sumP.transpose() * Base::m_dSumN) -
86 (Base::m_sumP.transpose() * Base::m_sumN) * m_d2SumW.transpose() -
87 (Base::m_dSumN.transpose() * Base::m_sumP + Base::m_dSumP.transpose() * Base::m_sumN) *
89 Scalar(2.) * Base::getWeightSum() * Base::m_dSumW.transpose() *
90 (Base::getWeightSum() *
91 (Base::m_sumN.transpose() * Base::m_dSumP + Base::m_sumP.transpose() * Base::m_dSumN) -
92 (Base::m_sumP.transpose() * Base::m_sumN) * Base::m_dSumW));
94 Matrix d2Deno = m_d2SumDotPP -
95 invSumW * invSumW * invSumW * invSumW *
96 (Base::getWeightSum() * Base::getWeightSum() *
97 (
Scalar(2.) * Base::getWeightSum() * (sumdSumPdSumP + sumd2SumPdSumP) +
98 Scalar(2.) * Base::m_dSumW.transpose() * (Base::m_sumP.transpose() * Base::m_dSumP) -
99 (Base::m_sumP.transpose() * Base::m_sumP) * m_d2SumW.transpose() -
100 Scalar(2.) * (Base::m_dSumP.transpose() * Base::m_sumP) * Base::m_dSumW) -
101 Scalar(2.) * Base::getWeightSum() * Base::m_dSumW.transpose() *
102 (
Scalar(2.) * Base::getWeightSum() * Base::m_sumP.transpose() * Base::m_dSumP -
103 (Base::m_sumP.transpose() * Base::m_sumP) * Base::m_dSumW));
105 Scalar deno2 = Base::m_deno * Base::m_deno;
107 m_d2Uq =
Scalar(.5) / (deno2 * deno2) *
108 (deno2 * (Base::m_dDeno.transpose() * Base::m_dNume + Base::m_deno * d2Nume -
109 Base::m_dNume.transpose() * Base::m_dDeno - Base::m_nume * d2Deno) -
110 Scalar(2.) * Base::m_deno * Base::m_dDeno.transpose() *
111 (Base::m_deno * Base::m_dNume - Base::m_nume * Base::m_dDeno));
113 for (
int i = 0; i < Dim; ++i)
115 m_d2Ul.template block<DerDim, DerDim>(0, i * DerDim) =
116 invSumW * (m_d2SumN.template block<DerDim, DerDim>(0, i * DerDim) -
117 Scalar(2.) * (m_d2Uq * Base::m_sumP[i] + Base::m_dSumP.row(i).transpose() * Base::m_dUq +
118 Base::m_uq * m_d2SumP.template block<DerDim, DerDim>(0, i * DerDim) +
119 Base::m_dUq.transpose() * Base::m_dSumP.row(i)) -
120 Base::m_ul[i] * m_d2SumW - Base::m_dUl.row(i).transpose() * Base::m_dSumW -
121 Base::m_dSumW.transpose() * Base::m_dUl.row(i));
124 Matrix sumdUldSumP = Matrix::Zero();
125 Matrix sumUld2SumP = Matrix::Zero();
126 Matrix sumd2UlsumP = Matrix::Zero();
127 Matrix sumdSumPdUl = Matrix::Zero();
129 for (
int i = 0; i < Dim; ++i)
131 sumdUldSumP += Base::m_dUl.row(i).transpose() * Base::m_dSumP.row(i);
132 sumUld2SumP += Base::m_ul[i] * m_d2SumP.template block<DerDim, DerDim>(0, i * DerDim);
133 sumd2UlsumP += m_d2Ul.template block<DerDim, DerDim>(0, i * DerDim) * Base::m_sumP[i];
134 sumdSumPdUl += Base::m_dSumP.row(i).transpose() * Base::m_dUl.row(i);
139 (sumdUldSumP + sumUld2SumP + sumd2UlsumP + sumdSumPdUl + Base::m_dUq.transpose() * Base::m_dSumDotPP +
140 Base::m_uq * m_d2SumDotPP + Base::m_dSumDotPP.transpose() * Base::m_dUq + m_d2Uq * Base::m_sumDotPP +
141 Base::m_uc * m_d2SumW + Base::m_dUc.transpose() * Base::m_dSumW + Base::m_dSumW.transpose() * Base::m_dUc);
144 return Base::m_eCurrentState;
185 VectorType grad = Base::m_dUc.template tail<Dim>().transpose() + Base::m_ul;
186 Scalar gradNorm = grad.norm();
188 if (Base::isScaleDer())
189 result.col(0) = m_d2Uc.template topRightCorner<1, Dim>().transpose() + Base::m_dUl.col(0);
191 if (Base::isSpaceDer())
193 result.template rightCols<Dim>() = m_d2Uc.template bottomRightCorner<Dim, Dim>().transpose() +
194 Base::m_dUl.template rightCols<Dim>().transpose() +
195 Base::m_dUl.template rightCols<Dim>();
196 result.template rightCols<Dim>().diagonal().array() +=
Scalar(2.) * Base::m_uq;
199 return result / gradNorm - grad * grad.transpose() / (gradNorm * gradNorm) * result;