Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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];
            }
        }