Surface fairing given boundary constraints depends on the order of the Laplacian. A simple graph Laplacian ${\prosedeflabel{fairing}{{L}}}$ can be written in terms of the adjacency matrix ${\proselabel{fairing}{{A}}}$ and the degree matrix ${\prosedeflabel{fairing}{{D}}}$ . Those matrices can be derived purely from the the edges of the mesh ${\prosedeflabel{fairing}{{E}}}$ .
$$\DeclareMathOperator*{\argmax}{arg\,max}
\DeclareMathOperator*{\argmin}{arg\,min}
\begin{align*}
\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'A', 'fairing', 'def', false, '')", "id":"fairing-A", "sym":"A", "func":"fairing", "localFunc":"", "type":"def", "case":"equation"} }{ {\mathit{A}} }_{\mathit{i}, \mathit{j}} & = \begin{cases} 1 & \text{if } \left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'i', 'fairing', 'use', false, '')", "id":"fairing-i", "sym":"i", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{i}} }, \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'j', 'fairing', 'use', false, '')", "id":"fairing-j", "sym":"j", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{j}} } \right) \in \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E', 'fairing', 'use', false, '')", "id":"fairing-E", "sym":"E", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{E}} } \\1 & \text{if } \left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'j', 'fairing', 'use', false, '')", "id":"fairing-j", "sym":"j", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{j}} }, \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'i', 'fairing', 'use', false, '')", "id":"fairing-i", "sym":"i", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{i}} } \right) \in \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E', 'fairing', 'use', false, '')", "id":"fairing-E", "sym":"E", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{E}} } \\ 0 & \text{otherwise} \end{cases}\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'fairing', ['A'], false, [], [], 'QV9paiA9IHsgMSBpZiAoaSxqKSDiiIggRQogICAgICAgICAxIGlmIChqLGkpIOKIiCBFCiAgICAgICAgIDAgb3RoZXJ3aXNl');"} }{}
\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'D', 'fairing', 'def', false, '')", "id":"fairing-D_ii", "sym":"D", "func":"fairing", "localFunc":"", "type":"def", "case":"equation"} }{ {\mathit{D}} }_{\mathit{i},\mathit{i}} & = \sum_{\mathit{j}} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'A', 'fairing', 'use', false, '')", "id":"fairing-A", "sym":"A", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{A}} }_{\mathit{i}, \mathit{j}}\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'fairing', ['A', 'D'], false, [], [], 'RF9paSA9IOKIkV9qIEFfaWo=');"} }{}
\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'L', 'fairing', 'def', false, '')", "id":"fairing-L", "sym":"L", "func":"fairing", "localFunc":"", "type":"def", "case":"equation"} }{ {\mathit{L}} } & = \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'D', 'fairing', 'use', false, '')", "id":"fairing-D", "sym":"D", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{D}} }^{-1}\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'D', 'fairing', 'use', false, '')", "id":"fairing-D", "sym":"D", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{D}} } - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'A', 'fairing', 'use', false, '')", "id":"fairing-A", "sym":"A", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{A}} } \right)\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'fairing', ['A', 'D', 'L'], false, [], [], 'TCA9IETigbvCuSAoIEQgLSBBICk=');"} }{}
\end{align*}
\tag{1}\label{1}$$
We then solve a system of equations $Lx = 0$ for free vertices to obtain the fair surface. We can write the fair mesh vertices ${\prosedeflabel{fairing}{{V'}}}$ directly given boundary constraints provided as a binary vector ${\prosedeflabel{fairing}{{B}}}$ with 1’s for boundary vertices , a large scalar constraint weight $\DeclareMathOperator*{\argmax}{arg\,max}
\DeclareMathOperator*{\argmin}{arg\,min}
\begin{align*}
\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'w', 'fairing', 'def', false, '')", "id":"fairing-w", "sym":"w", "func":"fairing", "localFunc":"", "type":"def", "case":"equation"} }{ {\mathit{w}} } & = {10}^{6}\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'fairing', ['w'], false, [], [], 'dz0xMF42');"} }{}
\end{align*}
$ , and 3D vertices for the constrained mesh ${\prosedeflabel{fairing}{{V}}}$ :
$$\DeclareMathOperator*{\argmax}{arg\,max}
\DeclareMathOperator*{\argmin}{arg\,min}
\begin{align*}
\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V\\'', 'fairing', 'def', false, '')", "id":"fairing-V\\'", "sym":"V\\'", "func":"fairing", "localFunc":"", "type":"def", "case":"equation"} }{ {V'} } & = \left( {\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'L', 'fairing', 'use', false, '')", "id":"fairing-L", "sym":"L", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{L}} }}^{2} + \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'w', 'fairing', 'use', false, '')", "id":"fairing-w", "sym":"w", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{w}} }diag\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'B', 'fairing', 'use', false, '')", "id":"fairing-B", "sym":"B", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{B}} } \right) \right)^{-1}\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'w', 'fairing', 'use', false, '')", "id":"fairing-w", "sym":"w", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{w}} }diag\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'B', 'fairing', 'use', false, '')", "id":"fairing-B", "sym":"B", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{B}} } \right)\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'fairing', 'use', false, '')", "id":"fairing-V", "sym":"V", "func":"fairing", "localFunc":"", "type":"use", "case":"equation"} }{ {\mathit{V}} } \right)\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'fairing', ['L', 'B', 'V', 'w', 'V\\''], false, [], [], 'YFYnYCA9IChMwrIgKyB3IGRpYWcoQikp4oG7wrkgKHcgZGlhZyhCKSBWKQ==');"} }{}
\end{align*}
\tag{2}\label{2}$$
Fairing the middle half of a cylinder.