protected void DiscontinuityConstraint(int vertI, int vertJ, List <int> faceList) { foreach (var faceId in faceList) { var orig = new MxVector3(model.Vertex(vertI)); var dest = new MxVector3(model.Vertex(vertJ)); var edge = dest - orig; var nml = new[] { 0.0, 0.0, 0.0 }; model.ComputeFaceNormal(faceId, ref nml); var n = new MxVector3(nml); var n2 = edge ^ n; MxVector3.Unitize(ref n2); var quad = new MxQuadric3(n2, -(n2 * orig)); quad *= BoundaryWeight; if (WeightingPolicy == MxWeighting.Area || WeightingPolicy == MxWeighting.AreaAverage) { quad.Area = MxVector3.Norm(edge); quad *= quad.Area; } quadrics[vertI] += quad; quadrics[vertJ] += quad; } }
internal static double TriangleArea(MxVector3 v1, MxVector3 v2, MxVector3 v3) { var vec = TriangleRawNormal(v1, v2, v3); return(0.5 * (MxVector3.Norm(vec))); }