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; }
public override void Compute(List <Node> allNodes) { Triple move = allNodes[NodeIndices[1]].Position - allNodes[NodeIndices[0]].Position; if (move.IsAlmostZero(1E-5f)) { move = new Triple(1E-5f); } move *= 0.5f * (move.Length - TargetLength) / move.Length; Moves[0] = move; Moves[1] = -move; }
public override void Compute(List <Node> allNodes) { int lineCount = NodeCount / 2; Triple targetDirection = Triple.Zero; for (int i = 0; i < lineCount; i++) { targetDirection += (allNodes[NodeIndices[2 * i + 1]].Position - allNodes[NodeIndices[2 * i]].Position).Normalise(); } targetDirection = targetDirection.IsAlmostZero() ? Triple.BasisX : targetDirection.Normalise(); for (int i = 0; i < lineCount; i++) { Triple v = allNodes[NodeIndices[2 * i + 1]].Position - allNodes[NodeIndices[2 * i]].Position; Moves[2 * i] = 0.5f * (v - v.Dot(targetDirection) * targetDirection); Moves[2 * i + 1] = -Moves[2 * i]; } }