Ejemplo 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;
        }
Ejemplo n.º 2
0
        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;
                    }
                }
            }
        }