Ejemplo n.º 1
0
    void RunBallPivot(float[] passes)
    {
        startTime = Time.realtimeSinceStartup;
        f         = new Front();

        ballRadius = passes[0];
        pivoter    = new Pivoter(cloud, ballRadius);
        Debug.Log("Pivoter initialized in: " + (Time.realtimeSinceStartup - startTime) + "s");

        while (true)
        {
            Edge e;
            while ((e = f.GetActiveEdge()) != null)
            {
                Tuple <int, Triangle> t = pivoter.Pivot(e);
                if (t != null && (!pivoter.IsUsed(t.Item1) || f.InFront(t.Item1)))
                {
                    preMesh.Add(t.Item2);
                    f.JoinAndGlue(t, pivoter);
                }
                else
                {
                    f.SetInactive(e);
                }
            }

            Triangle tri;
            if ((tri = pivoter.FindSeed()) != null)
            {
                preMesh.Add(tri);
                f.AddEdges(tri);
            }
            else
            {
                pivoter.FindSeed();
                break;
            }
        }
    }
Ejemplo n.º 2
0
    internal void JoinAndGlue(Tuple <int, Triangle> tri, Pivoter pivoter)
    {
        //join and glue prototype
        //if (f.Contains(new Edge(e.First, p)))
        //	Glue(new Edge(p, e.First), new Edge(e.First, p));
        //if (f.Contains(new Edge(e.Second, p)))
        //	Glue(new Edge(p, e.First), new Edge(p, e.First));

        if (!pivoter.IsUsed(tri.Item1))
        {
            for (int i = 0; i < 2; i++)
            {
                Edge e = tri.Item2.GetEdge(i);
                LinkedListNode <Edge> insertionPlace = front.AddBefore(pos, e);
                AddEdgePoints(insertionPlace);
            }

            RemoveEdgePoints(pos.Value);

            bool atEnd = false;
            var  tmp   = pos.Next;
            if (tmp == null)
            {
                tmp   = pos.Previous;
                atEnd = true;
            }
            front.Remove(pos);
            //move iterator to first added edge
            if (!atEnd)
            {
                pos = tmp.Previous.Previous;
            }
            else
            {
                pos = tmp.Previous;
            }


            pivoter.SetUsed(tri.Item1);
        }
        else if (InFront(tri.Item1))
        {
            int added = 0;
            for (int i = 0; i < 2; i++)
            {
                Edge e = tri.Item2.GetEdge(i);
                LinkedListNode <Edge> it = IsPresent(e);
                if (it != null)
                {
                    RemoveEdgePoints(it.Value);
                    front.Remove(it);
                }
                else
                {
                    LinkedListNode <Edge> insertionPlace = front.AddBefore(pos, e);
                    AddEdgePoints(insertionPlace);
                    added--;
                }
            }

            var tmp = pos.Next;
            if (tmp == null)
            {
                tmp = pos.Previous;
                added++;
            }
            RemoveEdgePoints(pos.Value);
            front.Remove(pos);
            pos = tmp;

            if (added < 0)
            {
                while (added < 0)
                {
                    pos = pos.Previous;
                    added++;
                }
            }
            else
            {
                pos = front.First;
            }
        }
        else
        {
            SetInactive(pos.Value);
        }
    }
Ejemplo n.º 3
0
    bool StepBallPivot()
    {
        bool updated = false;
        Edge e;
        int  i = 0;


        if (pivotingInAction)
        {
            if (currentPivotStepNum < pivotAnimationSteps)
            {
                currentPivotStepNum++;
                if (currentPivotStepNum == pivotAnimationSteps)
                {
                    pivotingInAction    = false;
                    currentPivotStepNum = 0;
                    preMesh.Add(toAdd);
                    updated = true;
                    ball.transform.position = newPos;
                }
                else
                {
                    //ball.transform.position = oldPos + (newPos - oldPos) * (1.0f / pivotAnimationSteps) * currentPivotStepNum;
                    ball.transform.RotateAround(pivotEdge.MiddlePoint, (pivotEdge.Second.Item1 - pivotEdge.MiddlePoint).normalized, Mathf.Rad2Deg * pivotedAngle);
                }
            }
        }
        else
        {
            for (i = 0; i < pivotsPerUpdate && (e = f.GetActiveEdge()) != null; i++)
            {
                Tuple <int, Triangle> t = pivoter.Pivot(e);
                if (t != null && (!pivoter.IsUsed(t.Item1) || f.InFront(t.Item1)))
                {
                    if (pivotsPerUpdate == 1)
                    {
                        pivotingInAction        = true;
                        toAdd                   = t.Item2;
                        oldPos                  = e.BallCenter;
                        newPos                  = t.Item2.BallCenter;
                        ball.transform.position = oldPos;
                        //pivotedAngle = (pivoter.PivotedAngle) * (1.0f / pivotAnimationSteps);
                        Vector3 a = (oldPos - e.MiddlePoint);
                        Vector3 b = newPos - e.MiddlePoint;
                        pivotedAngle = Mathf.Acos(a.Dot(b) / (a.magnitude * b.magnitude)) * (1.0f / pivotAnimationSteps);
                        pivotEdge    = e;
                    }
                    else
                    {
                        preMesh.Add(t.Item2);
                        updated = true;
                    }
                    f.JoinAndGlue(t, pivoter);
                }
                else
                {
                    f.SetInactive(e);
                }
            }

            if (i == 0)
            {
                Triangle tri;
                if ((tri = pivoter.FindSeed()) != null)
                {
                    preMesh.Add(tri);
                    updated = true;
                    ball.transform.position = tri.BallCenter;
                    f.AddEdges(tri);
                }
                else
                {
                    running = false;
                }
            }
        }
        return(updated);
    }