internal override void Compute(List <Node> allNodes) { Triple A = allNodes[NodeIndices[0]].Position; Triple B = allNodes[NodeIndices[1]].Position; Triple C = allNodes[NodeIndices[2]].Position; Triple BA = A - B; Triple BC = C - B; Triple m = (BA + BC).Normalise(); Triple N = BA.Cross(BC); if (N.IsAlmostZero()) { N = Triple.BasisX; } Triple mA = m.Rotate(Triple.Zero, N, -0.5f * TargetAngle); Triple mB = m.Rotate(Triple.Zero, N, +0.5f * TargetAngle); Moves[0] = B + m * mA.Dot(BA) - A; Moves[2] = B + m * mB.Dot(BC) - C; Weights[0] = Weights[1] = Weights[2] = Weight; }
internal override void Compute(List <Node> allNodes) { Moves = new Triple[NodeCount]; Weights = new float[NodeCount]; if (polygonVertices == null || polygonVertices.Count <= 3) { return; } Moves = new Triple[NodeCount]; Weights = new float[NodeCount]; int[] moveCounts = new int[NodeCount]; for (int j = 0; j < polygonVertices.Count; j++) { Triple s = polygonVertices[j]; Triple e = polygonVertices[j + 1 < polygonVertices.Count ? j + 1 : 0]; Triple d = e - s; Triple n = d.Cross(planeNormal).Normalise(); for (int i = 0; i < NodeCount; i++) { Triple c = allNodes[NodeIndices[i]].Position; float r = Radii[i]; Triple v = c - s; float shadow = n.Dot(v); if (shadow <= -r) { continue; } Moves[i] += n * (-r - shadow); moveCounts[i]++; } for (int i = 0; i < NodeIndices.Length; i++) { if (moveCounts[i] != 0) { Moves[i] /= moveCounts[i]; Weights[i] = Weight; } } } }