The second step in the error correction algorithm (Fig. 5) was to generate virtually computed contact locations for each possible configuration (i.e., combination of size and thickness of articular surface insert with corresponding conversion tray) of the tibial force sensor. A solid model of the tibial articular surface of each of the 15 possible configurations (3 sizes × 5 thicknesses for each size for this particular tibial component) was converted into a point cloud (Geomagic Control; 3D Systems, Rock Hill, SC). A surface fit function (Eq. (6)) that mathematically described the shape of the tibial articular surface was determined for each compartment in each configuration. For each function (Eq. (6)), 21 coefficients were determined that minimized the differences between the calculated (*h*_{i}_{,}_{j}) and actual height of the point above the mounting plane of the transducers using a least squares optimization (*cftool*, matlab R2014b; MathWorks, Natick, MA). The orientation of the surface normal relative to the normal of the tibial baseplate in both the coronal (*φ*) and sagittal (*θ*) planes was determined by taking the inverse tangent of the partial derivatives of the surface fit functions with respect to the ML and AP directions, respectively (Eqs. (7) and (8)). Virtually generated errors in the ML and AP coordinates of the contact locations were determined using the error prediction functions (Eqs. (4) and (5)) for each point in the point cloud. These errors were determined for each point for force values from 45 N to 450 N in 45 N increments. Finally, a virtually computed contact location ($MLvirtually\u2009computed,i,j$ and $APvirtually\u2009computed,i,j$) was generated for each point in each point cloud by adding the virtually generated errors in the ML and AP coordinates to the actual ML and AP coordinates of each point in the point cloud, respectively (Eqs. (9) and (10)). In Eqs. (6)–(10), the index, *i*, indicates the compartment (i.e., either medial or lateral), and the index, *j*, indicates the configuration (i.e., configuration 1,…, configuration *j*,…, configuration *n*).
Display Formula

(6)$hi,j=b00,i,j+b10,i,jMLi,j+b01,i,jAPi,j+b11,i,jMLi,jAPi,j+b20,i,jMLi,j2+b02,i,jAPi,j2+b21,i,jMLi,j2APi,j+b12,i,jMLi,jAPi,j2+b22,i,jMLi,j2APi,j2+b30,i,jMLi,j3+b03,i,jAPi,j3+b31,i,jMLi,j3APi,j+b13,i,jMLi,jAPi,j3+b32,i,jMLi,j3APi,j2+b23,i,jMLi,j2APi,j3+b40,i,jMLi,j4+b04,i,jAPi,j4+b14,i,jMLi,jAPi,j4+b41,i,jMLi,j4APi,j+b50,i,jMLi,j5+b05,i,jAPi,j5$

Display Formula(7)$\phi i,j=tan\u22121(\u2202hi,j\u2202MLi,j)$

Display Formula(8)$\theta i,j=tan\u22121(\u2202hi,j\u2202APi,j)$

Display Formula(9)$MLvirtually\u2009computed,i,j=MLactual,i,j+eML,i,j$

Display Formula(10)$APvirtually\u2009computed,i,j=APactual,i,j+eAP,i,j$