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 double ComputeCornerAngle(int faceId, int corner) { var cornerPrev = (corner == 0) ? 2 : (corner - 1); var cornerNext = (corner == 2) ? 0 : (corner + 1); var ePrev = new double[3]; MxVectorOps.Sub3(ref ePrev, Corner(faceId, cornerPrev).Pos, Corner(faceId, corner).Pos); MxVectorOps.Unitize3(ref ePrev); var eNext = new double[3]; MxVectorOps.Sub3(ref eNext, Corner(faceId, cornerNext).Pos, Corner(faceId, corner).Pos); MxVectorOps.Unitize3(ref eNext); return(Math.Acos(MxVectorOps.Dot3(ePrev, eNext))); }
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); }
internal void ComputeVertexNormal(int vertId, ref double[] nml) { for (var i = 0; i < 3; i++) { nml[i] = 0.0; } var star = faceLinks[vertId]; foreach (var faceId in star) { var faceNml = new double[3]; ComputeFaceNormal(faceId, ref faceNml, false); MxVectorOps.AddInto3(ref nml, faceNml); } if (star.Count > 1) { MxVectorOps.Unitize3(ref nml); } }