internal void ComputeFaceNormal(int faceId, ref double[] nml, bool willUnitize = true) { var v0 = Vertex(Face(faceId)[0]); var v1 = Vertex(Face(faceId)[1]); var v2 = Vertex(Face(faceId)[2]); var a = new[] { v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2] }; var b = new[] { v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2] }; MxVectorOps.Cross3(ref nml, a, b); if (willUnitize) { MxVectorOps.Unitize3(ref nml); } }
internal int CheckLocalValidity(int vertId, double[] vNew) { var n1 = model.Neighbors(vertId); var nFailed = 0; foreach (var faceId in n1) { if (!model.FaceIsValid(faceId)) { continue; } var face = model.Face(faceId); var k = face.FindVertex(vertId); var x = face[(k + 1) % 3]; var y = face[(k + 2) % 3]; var vPos = model.Vertex(vertId).Pos; var xPos = model.Vertex(x).Pos; var yPos = model.Vertex(y).Pos; var dYX = new double[3]; MxVectorOps.Sub3(ref dYX, xPos, yPos); var dVX = new double[3]; MxVectorOps.Sub3(ref dVX, vPos, xPos); var dVNew = new double[3]; MxVectorOps.Sub3(ref dVNew, vNew, xPos); var fN = new double[3]; MxVectorOps.Cross3(ref fN, dYX, dVX); var nml = new double[3]; MxVectorOps.Cross3(ref nml, dYX, dVX); MxVectorOps.Unitize3(ref nml); if (MxVectorOps.Dot3(dVNew, nml) < LocalValidityThreshold * MxVectorOps.Dot3(dVX, nml)) { nFailed++; } } return(nFailed); }