Given a ScaffoldSketch model with an existing set of constraint functions, we will imagine that a user clicks on an edge or vertex and manipulates it. All adjacent edges or vertices may be affected by this change. They are “live” in an optimization process we run which updates the live vertex positions. The optimization re-uses the constraint functions determined in the original ScaffoldSketch model. That is, there are a set of constraint functions E{pairwise} that take two line segments as input and compute the distance from satisfaction and a set of constraint functions E that take one line segment. In the future, we may want a threshold base on the user’s manipulation to remove constraints that no longer seem relevant based on the manipulation.
One kind of constraint measures the difference in lengths between two lines ab and pq:

$$\DeclareMathOperator*{\argmax}{arg\,max} \DeclareMathOperator*{\argmin}{arg\,min} \begin{align*} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{length}', 'ScaffoldSketch', 'def', false, '')", "id":"ScaffoldSketch-E_{length}", "sym":"E_{length}", "func":"ScaffoldSketch", "localFunc":"", "type":"def", "case":"equation"} }{ {E_{length}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{length}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"use", "case":"equation"} }{ {\mathit{V}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'a', 'ScaffoldSketch', 'use', true, 'E_{length}')", "id":"ScaffoldSketch-a", "sym":"a", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"use", "case":"equation"} }{ {\mathit{a}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'b', 'ScaffoldSketch', 'use', true, 'E_{length}')", "id":"ScaffoldSketch-b", "sym":"b", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"use", "case":"equation"} }{ {\mathit{b}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'p', 'ScaffoldSketch', 'use', true, 'E_{length}')", "id":"ScaffoldSketch-p", "sym":"p", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"use", "case":"equation"} }{ {\mathit{p}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'q', 'ScaffoldSketch', 'use', true, 'E_{length}')", "id":"ScaffoldSketch-q", "sym":"q", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"use", "case":"equation"} }{ {\mathit{q}} } \right) & = {\left( \frac{\left\|\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{length}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{a}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{length}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{b}, *}\right\|}{\left\|\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{length}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{p}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{length}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{q}, *}\right\|} - 1 \right)}^{2}\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'ScaffoldSketch', ['a', 'b', 'q', 'p', 'V', 'E_{length}'], true, 'E_{length}', ['V', 'a', 'b', 'p', 'q'], 'YEVfe2xlbmd0aH1gKCBWLCBhLCBiLCBwLCBxICkgPSAo4oCWIFZfYSwqIC0gVl9iLCog4oCWL-KAliBWX3AsKiAtIFZfcSwq4oCWIC0xKV4yIHdoZXJlIFYg4oiIIOKEnV4obcOXMyksIGEg4oiIIOKEpCwgYiDiiIgg4oSkLCBwIOKIiCDihKQsIHEg4oiIIOKEpA==');"} }{} \end{align*} \tag{1}\label{1}$$

where ${\prosedeflabel{ScaffoldSketch}{{V}}}$ is the points. , ${\prosedeflabel{ScaffoldSketch}{{a}}}$, ${\prosedeflabel{ScaffoldSketch}{{b}}}$, ${\prosedeflabel{ScaffoldSketch}{{p}}}$, ${\prosedeflabel{ScaffoldSketch}{{q}}}$ are the indices. , ${\prosedeflabel{ScaffoldSketch}{{E_{length}}}}$ takes in points ${\proselabel{ScaffoldSketch}{{V}}}$ and the index ${\proselabel{ScaffoldSketch}{{a}}}$, ${\proselabel{ScaffoldSketch}{{b}}}$, ${\proselabel{ScaffoldSketch}{{p}}}$, ${\proselabel{ScaffoldSketch}{{q}}}$ returns length energy.

Another measures whether two lines are parallel:

$$\DeclareMathOperator*{\argmax}{arg\,max} \DeclareMathOperator*{\argmin}{arg\,min} \begin{align*} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{parallel}', 'ScaffoldSketch', 'def', false, 'E_{length}')", "id":"ScaffoldSketch-E_{parallel}", "sym":"E_{parallel}", "func":"ScaffoldSketch", "localFunc":"E_{length}", "type":"def", "case":"equation"} }{ {E_{parallel}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{V}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'a', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-a", "sym":"a", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{a}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'b', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-b", "sym":"b", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{b}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'p', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-p", "sym":"p", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{p}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'q', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-q", "sym":"q", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{q}} } \right) & = {\left( \left|\left( \frac{\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{a}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{b}, *}}{\left\|\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{a}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{b}, *}\right\|} \right) \cdot \left( \frac{\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{p}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{q}, *}}{\left\|\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{p}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{parallel}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{q}, *}\right\|} \right)\right| - 1 \right)}^{2}\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'ScaffoldSketch', ['a', 'b', 'q', 'p', 'V', 'E_{parallel}'], true, 'E_{parallel}', ['V', 'a', 'b', 'p', 'q'], 'YEVfe3BhcmFsbGVsfWAoIFYsIGEsIGIsIHAsIHEgKSA9ICh8KChWX2EsKi1WX2IsKikv4oCWIFZfYSwqIC0gVl9iLCog4oCWKeKLhSgoVl9wLCotVl9xLCopL-KAliBWX3AsKiAtIFZfcSwqIOKAlil8IC0gMSnCsiB3aGVyZSBWIOKIiCDihJ1eKG3DlzMpLCBhIOKIiCDihKQsIGIg4oiIIOKEpCwgcCDiiIgg4oSkLCBxIOKIiCDihKQ=');"} }{} \end{align*} \tag{2}\label{2}$$

where ${\prosedeflabel{ScaffoldSketch}{{E_{parallel}}}}$ takes in points ${\proselabel{ScaffoldSketch}{{V}}}$ and the index ${\proselabel{ScaffoldSketch}{{a}}}$, ${\proselabel{ScaffoldSketch}{{b}}}$, ${\proselabel{ScaffoldSketch}{{p}}}$, ${\proselabel{ScaffoldSketch}{{q}}}$ returns parallel energy.

Another measures whether two lines are perpendicular:

$$\DeclareMathOperator*{\argmax}{arg\,max} \DeclareMathOperator*{\argmin}{arg\,min} \begin{align*} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{perpendicular}', 'ScaffoldSketch', 'def', false, 'E_{parallel}')", "id":"ScaffoldSketch-E_{perpendicular}", "sym":"E_{perpendicular}", "func":"ScaffoldSketch", "localFunc":"E_{parallel}", "type":"def", "case":"equation"} }{ {E_{perpendicular}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{V}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'a', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-a", "sym":"a", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{a}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'b', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-b", "sym":"b", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{b}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'p', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-p", "sym":"p", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{p}} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'q', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-q", "sym":"q", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{q}} } \right) & = {\left( \left|\left( \frac{\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{a}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{b}, *}}{\left\|\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{a}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{b}, *}\right\|} \right) \cdot \left( \frac{\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{p}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{q}, *}}{\left\|\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{p}, *} - \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V", "sym":"V", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{V}} }_{\mathit{q}, *}\right\|} \right)\right| \right)}^{2}\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'ScaffoldSketch', ['a', 'b', 'q', 'p', 'V', 'E_{perpendicular}'], true, 'E_{perpendicular}', ['V', 'a', 'b', 'p', 'q'], 'YEVfe3BlcnBlbmRpY3VsYXJ9YCggViwgYSwgYiwgcCwgcSApID0gKHwoKFZfYSwqLVZfYiwqKS_igJYgVl9hLCogLSBWX2IsKiDigJYp4ouFKChWX3AsKi1WX3EsKikv4oCWIFZfcCwqIC0gVl9xLCog4oCWKXwpwrIgd2hlcmUgViDiiIgg4oSdXihtw5czKSwgYSDiiIgg4oSkLCBiIOKIiCDihKQsIHAg4oiIIOKEpCwgcSDiiIgg4oSk');"} }{} \end{align*} \tag{3}\label{3}$$

where ${\prosedeflabel{ScaffoldSketch}{{E_{perpendicular}}}}$ takes in points ${\proselabel{ScaffoldSketch}{{V}}}$ and the index ${\proselabel{ScaffoldSketch}{{a}}}$, ${\proselabel{ScaffoldSketch}{{b}}}$, ${\proselabel{ScaffoldSketch}{{p}}}$, ${\proselabel{ScaffoldSketch}{{q}}}$ returns perpendicular energy.

Given a set of these functions and corresponding sets of positions given as indices into an array $ {\proselabel{ScaffoldSketch}{{V_o}}} ∈ ℝ^({\proselabel{ScaffoldSketch}{{n}}} × 3) $, we can find new positions via optimization:

$$\DeclareMathOperator*{\argmax}{arg\,max} \DeclareMathOperator*{\argmin}{arg\,min} \begin{align*} \begin{aligned} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 't', 'ScaffoldSketch', 'def', false, 'E_{perpendicular}')", "id":"ScaffoldSketch-t", "sym":"t", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"def", "case":"equation"} }{ {\mathit{t}} } = \min_{V_o \in \mathbb{R}^{ \mathit{n} \times 3 }} \quad & \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{len}', 'ScaffoldSketch', 'use', false, 'E_{perpendicular}')", "id":"ScaffoldSketch-E_{len}", "sym":"E_{len}", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {E_{len}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V_o', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V_o", "sym":"V_o", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {V_o} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'L', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-L", "sym":"L", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{L}} } \right) + \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{par}', 'ScaffoldSketch', 'use', false, 'E_{perpendicular}')", "id":"ScaffoldSketch-E_{par}", "sym":"E_{par}", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {E_{par}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V_o', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V_o", "sym":"V_o", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {V_o} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'P', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-P", "sym":"P", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{P}} } \right) + \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{per}', 'ScaffoldSketch', 'use', false, 'E_{perpendicular}')", "id":"ScaffoldSketch-E_{per}", "sym":"E_{per}", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {E_{per}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V_o', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-V_o", "sym":"V_o", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {V_o} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'Q', 'ScaffoldSketch', 'use', true, 'E_{perpendicular}')", "id":"ScaffoldSketch-Q", "sym":"Q", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"use", "case":"equation"} }{ {\mathit{Q}} } \right) \\ \end{aligned}\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'ScaffoldSketch', ['E_{par}', 'Q', 'V_o', 'E_{per}', 'E_{len}', 'P', 'L', 't'], false, [], [], 'dCA9IHdpdGggIGluaXRpYWwgIGBWX29gID0gYFbigoBgCm1pbl8oIGBWX29gIOKIiCDihJ1eKG7DlzMpICkgYEVfe2xlbn1gKCBgVl9vYCwgTCkgKyBgRV97cGFyfWAoYFZfb2AsIFApICtgRV97cGVyfWAoIGBWX29gLCBRKQ==');"} }{} \end{align*} \tag{4}\label{4}$$

where ${\prosedeflabel{ScaffoldSketch}{{V_o}}}$ is the subset of points to be optimized. , ${\prosedeflabel{ScaffoldSketch}{{V₀}}}$ is the intial value of ${\proselabel{ScaffoldSketch}{{V_o}}}$. , ${\prosedeflabel{ScaffoldSketch}{{L}}}$, ${\prosedeflabel{ScaffoldSketch}{{P}}}$, ${\prosedeflabel{ScaffoldSketch}{{Q}}}$ are length, parallel and perpendicular indices. , and ${\prosedeflabel{ScaffoldSketch}{{t}}}$ is energy equals to the sum of ${\proselabel{ScaffoldSketch}{{E_{len}}}}$, ${\proselabel{ScaffoldSketch}{{E_{par}}}}$ and ${\proselabel{ScaffoldSketch}{{E_{per}}}}$. .

Since some vertices are fixed, function f is used to get the position of all vertices. In order to conveniently get the positionfor each energy, we can use several helper functions to index the full position matrix.

$$\DeclareMathOperator*{\argmax}{arg\,max} \DeclareMathOperator*{\argmin}{arg\,min} \begin{align*} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{len}', 'ScaffoldSketch', 'def', false, 'E_{perpendicular}')", "id":"ScaffoldSketch-E_{len}", "sym":"E_{len}", "func":"ScaffoldSketch", "localFunc":"E_{perpendicular}", "type":"def", "case":"equation"} }{ {E_{len}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V_o', 'ScaffoldSketch', 'use', true, 'E_{len}')", "id":"ScaffoldSketch-V_o", "sym":"V_o", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"use", "case":"equation"} }{ {V_o} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'L', 'ScaffoldSketch', 'use', true, 'E_{len}')", "id":"ScaffoldSketch-L", "sym":"L", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"use", "case":"equation"} }{ {\mathit{L}} } \right) & = \sum_{\mathit{i}} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{length}', 'ScaffoldSketch', 'use', false, 'E_{len}')", "id":"ScaffoldSketch-E_{length}", "sym":"E_{length}", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"use", "case":"equation"} }{ {E_{length}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'f', 'ScaffoldSketch', 'use', false, 'E_{len}')", "id":"ScaffoldSketch-f", "sym":"f", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"use", "case":"equation"} }{ {\mathit{f}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V_o', 'ScaffoldSketch', 'use', true, 'E_{len}')", "id":"ScaffoldSketch-V_o", "sym":"V_o", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"use", "case":"equation"} }{ {V_o} } \right),\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'L', 'ScaffoldSketch', 'use', true, 'E_{len}')", "id":"ScaffoldSketch-L", "sym":"L", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"use", "case":"equation"} }{ {\mathit{L}} }_{\mathit{i}, 1},\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'L', 'ScaffoldSketch', 'use', true, 'E_{len}')", "id":"ScaffoldSketch-L", "sym":"L", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"use", "case":"equation"} }{ {\mathit{L}} }_{\mathit{i}, 2},\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'L', 'ScaffoldSketch', 'use', true, 'E_{len}')", "id":"ScaffoldSketch-L", "sym":"L", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"use", "case":"equation"} }{ {\mathit{L}} }_{\mathit{i}, 3},\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'L', 'ScaffoldSketch', 'use', true, 'E_{len}')", "id":"ScaffoldSketch-L", "sym":"L", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"use", "case":"equation"} }{ {\mathit{L}} }_{\mathit{i}, 4} \right)\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'ScaffoldSketch', ['V_o', 'E_{length}', 'f', 'L', 'E_{len}'], true, 'E_{len}', ['V_o', 'L'], 'YEVfe2xlbn1gKCBgVl9vYCwgTCkgPSDiiJFfaSBgRV97bGVuZ3RofWAoIGYoYFZfb2ApLCBMX2ksMSwgTF9pLDIsIExfaSwzLCBMX2ksNCAgKSB3aGVyZSBgVl9vYCDiiIgg4oSdXihuIMOXIDMpLCBMIOKIiCDihKReKGwgw5cgNCk=');"} }{} \end{align*} \tag{5}\label{5}$$

where ${\prosedeflabel{ScaffoldSketch}{{f}}}$ maps ${\proselabel{ScaffoldSketch}{{V}}}$ to ${\proselabel{ScaffoldSketch}{{V_o}}}$ , and ${\prosedeflabel{ScaffoldSketch}{{E_{len}}}}$ takes ${\proselabel{ScaffoldSketch}{{V_o}}}$, ${\proselabel{ScaffoldSketch}{{L}}}$ and sums all the length energy value.

$$\DeclareMathOperator*{\argmax}{arg\,max} \DeclareMathOperator*{\argmin}{arg\,min} \begin{align*} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{par}', 'ScaffoldSketch', 'def', false, 'E_{len}')", "id":"ScaffoldSketch-E_{par}", "sym":"E_{par}", "func":"ScaffoldSketch", "localFunc":"E_{len}", "type":"def", "case":"equation"} }{ {E_{par}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V_o', 'ScaffoldSketch', 'use', true, 'E_{par}')", "id":"ScaffoldSketch-V_o", "sym":"V_o", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"use", "case":"equation"} }{ {V_o} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'P', 'ScaffoldSketch', 'use', true, 'E_{par}')", "id":"ScaffoldSketch-P", "sym":"P", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"use", "case":"equation"} }{ {\mathit{P}} } \right) & = \sum_{\mathit{i}} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{parallel}', 'ScaffoldSketch', 'use', false, 'E_{par}')", "id":"ScaffoldSketch-E_{parallel}", "sym":"E_{parallel}", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"use", "case":"equation"} }{ {E_{parallel}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'f', 'ScaffoldSketch', 'use', false, 'E_{par}')", "id":"ScaffoldSketch-f", "sym":"f", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"use", "case":"equation"} }{ {\mathit{f}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V_o', 'ScaffoldSketch', 'use', true, 'E_{par}')", "id":"ScaffoldSketch-V_o", "sym":"V_o", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"use", "case":"equation"} }{ {V_o} } \right),\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'P', 'ScaffoldSketch', 'use', true, 'E_{par}')", "id":"ScaffoldSketch-P", "sym":"P", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"use", "case":"equation"} }{ {\mathit{P}} }_{\mathit{i}, 1},\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'P', 'ScaffoldSketch', 'use', true, 'E_{par}')", "id":"ScaffoldSketch-P", "sym":"P", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"use", "case":"equation"} }{ {\mathit{P}} }_{\mathit{i}, 2},\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'P', 'ScaffoldSketch', 'use', true, 'E_{par}')", "id":"ScaffoldSketch-P", "sym":"P", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"use", "case":"equation"} }{ {\mathit{P}} }_{\mathit{i}, 3},\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'P', 'ScaffoldSketch', 'use', true, 'E_{par}')", "id":"ScaffoldSketch-P", "sym":"P", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"use", "case":"equation"} }{ {\mathit{P}} }_{\mathit{i}, 4} \right)\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'ScaffoldSketch', ['V_o', 'f', 'P', 'E_{parallel}', 'E_{par}'], true, 'E_{par}', ['V_o', 'P'], 'YEVfe3Bhcn1gKCBgVl9vYCwgUCkgPSDiiJFfaSBgRV97cGFyYWxsZWx9YCggZihgVl9vYCksIFBfaSwxLCBQX2ksMiwgUF9pLDMsIFBfaSw0ICApIHdoZXJlIGBWX29gIOKIiCDihJ1eKG4gw5cgMyksIFAg4oiIIOKEpF4ocCDDlyA0KQ==');"} }{} \end{align*} \tag{6}\label{6}$$

where ${\prosedeflabel{ScaffoldSketch}{{E_{par}}}}$ takes ${\proselabel{ScaffoldSketch}{{V_o}}}$, ${\proselabel{ScaffoldSketch}{{P}}}$ and sums all the parallel energy value.

$$\DeclareMathOperator*{\argmax}{arg\,max} \DeclareMathOperator*{\argmin}{arg\,min} \begin{align*} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{per}', 'ScaffoldSketch', 'def', false, 'E_{par}')", "id":"ScaffoldSketch-E_{per}", "sym":"E_{per}", "func":"ScaffoldSketch", "localFunc":"E_{par}", "type":"def", "case":"equation"} }{ {E_{per}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V_o', 'ScaffoldSketch', 'use', true, 'E_{per}')", "id":"ScaffoldSketch-V_o", "sym":"V_o", "func":"ScaffoldSketch", "localFunc":"E_{per}", "type":"use", "case":"equation"} }{ {V_o} },\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'Q', 'ScaffoldSketch', 'use', true, 'E_{per}')", "id":"ScaffoldSketch-Q", "sym":"Q", "func":"ScaffoldSketch", "localFunc":"E_{per}", "type":"use", "case":"equation"} }{ {\mathit{Q}} } \right) & = \sum_{\mathit{i}} \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'E_{perpendicular}', 'ScaffoldSketch', 'use', false, 'E_{per}')", "id":"ScaffoldSketch-E_{perpendicular}", "sym":"E_{perpendicular}", "func":"ScaffoldSketch", "localFunc":"E_{per}", "type":"use", "case":"equation"} }{ {E_{perpendicular}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'f', 'ScaffoldSketch', 'use', false, 'E_{per}')", "id":"ScaffoldSketch-f", "sym":"f", "func":"ScaffoldSketch", "localFunc":"E_{per}", "type":"use", "case":"equation"} }{ {\mathit{f}} }\left( \idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'V_o', 'ScaffoldSketch', 'use', true, 'E_{per}')", "id":"ScaffoldSketch-V_o", "sym":"V_o", "func":"ScaffoldSketch", "localFunc":"E_{per}", "type":"use", "case":"equation"} }{ {V_o} } \right),\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'Q', 'ScaffoldSketch', 'use', true, 'E_{per}')", "id":"ScaffoldSketch-Q", "sym":"Q", "func":"ScaffoldSketch", "localFunc":"E_{per}", "type":"use", "case":"equation"} }{ {\mathit{Q}} }_{\mathit{i}, 1},\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'Q', 'ScaffoldSketch', 'use', true, 'E_{per}')", "id":"ScaffoldSketch-Q", "sym":"Q", "func":"ScaffoldSketch", "localFunc":"E_{per}", "type":"use", "case":"equation"} }{ {\mathit{Q}} }_{\mathit{i}, 2},\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'Q', 'ScaffoldSketch', 'use', true, 'E_{per}')", "id":"ScaffoldSketch-Q", "sym":"Q", "func":"ScaffoldSketch", "localFunc":"E_{per}", "type":"use", "case":"equation"} }{ {\mathit{Q}} }_{\mathit{i}, 3},\idlabel{ {"onclick":"event.stopPropagation(); onClickSymbol(this, 'Q', 'ScaffoldSketch', 'use', true, 'E_{per}')", "id":"ScaffoldSketch-Q", "sym":"Q", "func":"ScaffoldSketch", "localFunc":"E_{per}", "type":"use", "case":"equation"} }{ {\mathit{Q}} }_{\mathit{i}, 4} \right)\\\eqlabel{ {"onclick":"event.stopPropagation(); onClickEq(this, 'ScaffoldSketch', ['Q', 'E_{perpendicular}', 'f', 'V_o', 'E_{per}'], true, 'E_{per}', ['V_o', 'Q'], 'YEVfe3Blcn1gKCBgVl9vYCwgUSkgPSDiiJFfaSBgRV97cGVycGVuZGljdWxhcn1gKCBmKGBWX29gKSwgUV9pLDEsIFFfaSwyLCBRX2ksMywgUV9pLDQgKSAgd2hlcmUgYFZfb2Ag4oiIIOKEnV4obiDDlyAzKSwgUSDiiIgg4oSkXihxIMOXIDQp');"} }{} \end{align*} \tag{7}\label{7}$$

where ${\prosedeflabel{ScaffoldSketch}{{E_{per}}}}$ takes ${\proselabel{ScaffoldSketch}{{V_o}}}$, ${\proselabel{ScaffoldSketch}{{Q}}}$ and sums all the perpendicular energy value.