public void InitializeGeometry(CartesianPoint crackMouth, CartesianPoint crackTip) { CrackMouth = crackMouth; var segment = new DirectedSegment2D(crackMouth, crackTip); double tangentX = crackTip.X - crackMouth.X; double tangentY = crackTip.Y - crackMouth.Y; double length = Math.Sqrt(tangentX * tangentX + tangentY * tangentY); double tangentSlope = Math.Atan2(tangentY, tangentX); this.crackTip = crackTip; tipSystem = new TipCoordinateSystem(crackTip, tangentSlope); tangentX /= length; tangentY /= length; foreach (XNode node in Mesh.Nodes) { levelSetsBody[node] = segment.SignedDistanceOf(node); levelSetsTip[node] = (node.X - crackTip.X) * tangentX + (node.Y - crackTip.Y) * tangentY; } }