Пример #1
0
    //get rotation angle
    //public float GetAngle(Transform from, Transform to, TetraEdge edge)
    //{
    //    var v0 = edge.GetCenter();
    //    var F = from.position - v0;
    //    var T = to.position - v0;
    //    var D = (from.position - to.position).magnitude;
    //    var E = GetEdgeLength();
    //    var A = Vector3.Angle(F, T);
    //    print(A);
    //    if (D > E)
    //    {
    //        A = 360 - A;
    //    }
    //    return A;
    //}

    //check the edge and get axis edge if edge was shared with others
    public void CheckSharedEdge(TetraBot nb)
    {
        //for (int i = 0; i < transform.childCount; i++)
        //{
        //    var e = transform.GetChild(i);
        //    if (e.tag == "ColliderBall")
        //    {

        //        //get other tetra edge which is shared with this one
        //        Debug.Log("get connect edge" + e);
        //        GetTetraEdge(e);
        //        _axis.Add(e);
        //    }
        //    else
        //    {

        //    }
        //}
        foreach (var e in Edges)
        {
            var tf = e.GetTransform();
            if (tf.tag == "ColliderBall")
            {
                var ee = e._Axis[0];
                GetTetraEdge(ee);
            }
        }
        print(_axis);
        Evaluatedis();
    }
Пример #2
0
    public void EvaluateNeighbor(TetraBot nb)
    {
        if (_sharedBotEdgeDic.ContainsKey(nb) && nb._sharedBotEdgeDic.ContainsKey(this))
        {
            _sharedBotEdgeDic[nb]      = new List <TetraEdge>();
            nb._sharedBotEdgeDic[this] = new List <TetraEdge>();
            _movablePoints[nb]         = new List <Transform>();
            nb._movablePoints[this]    = new List <Transform>();
        }


        foreach (var e in Edges)
        {
            foreach (var en in nb.GetEdges())
            {
                var ec = e.GetCenterXform();
                var nc = en.GetCenterXform();

                if (CloseEnoughPoint(ec, nc))
                {
                    print("share");
                    AddSharedEdge(nb, e);
                    nb.AddSharedEdge(this, en);
                }
            }
        }
        foreach (var v in _vertexs)
        {
            foreach (var vn in nb._vertexs)
            {
                AddMovablePoints(nb, v);
                nb.AddMovablePoints(this, vn);
            }
        }
        foreach (var v in _vertexs)
        {
            foreach (var vn in nb._vertexs)
            {
                if (CloseEnoughPoint(v, vn))
                {
                    _movablePoints[nb].Remove(v);
                    nb._movablePoints[this].Remove(vn);
                }
            }
        }
        print(_movablePoints[nb].Count);
    }
Пример #3
0
 public void AddSharedEdge(TetraBot nb, TetraEdge EdgeDir)
 {
     if (!_sharedBotEdgeDic.ContainsKey(nb))
     {
         _sharedBotEdgeDic.Add(nb, new List <TetraEdge>()
         {
             EdgeDir
         });
     }
     else
     {
         if (!_sharedBotEdgeDic[nb].Contains(EdgeDir))
         {
             _sharedBotEdgeDic[nb].Add(EdgeDir);
         }
     }
 }
Пример #4
0
 public void AddMovablePoints(TetraBot nb, Transform point)
 {
     if (!_movablePoints.ContainsKey(nb))
     {
         _movablePoints.Add(nb, new List <Transform>()
         {
             point
         });
     }
     else
     {
         if (!_movablePoints[nb].Contains(point))
         {
             _movablePoints[nb].Add(point);
         }
     }
 }
Пример #5
0
    public void Rotate(TetraBot nb, int edge, Transform fromPoint, Transform toPoint)
    {
        var e = nb._sharedBotEdgeDic[this][edge];

        var axis = transform.InverseTransformDirection(e.GetDirection());

        var angle = GetAngle(fromPoint, toPoint, e);

        var center = e.GetCenter();

        var from = fromPoint.position - center;
        var to   = toPoint.position - center;

        // var q = transform.rotation.eulerAngles + Quaternion.AngleAxis(angle, axis).eulerAngles;

        //transform.SetPositionAndRotation();


        transform.Rotate(axis, angle, Space.Self);
    }
Пример #6
0
    public void Rotate(TetraBot nb, int edge, Transform fromPoint, Transform toPoint)
    {
        var e = nb._sharedBotEdgeDic[this][edge];

        var axis = e.GetDirection();

        var angle = GetAngle(fromPoint, toPoint, e);

        var center = e.GetCenter();

        var pivot = e.GetCenterXform();

        transform.parent = pivot;

        pivot.Rotate(axis, angle);

        // var q = transform.rotation.eulerAngles + Quaternion.AngleAxis(angle, axis).eulerAngles;

        //transform.SetPositionAndRotation();

        transform.parent = pivot.parent.parent;
    }
Пример #7
0
    public void EvaluateNeighbor(TetraBot nb)
    {
        foreach (var e in Edges)
        {
            foreach (var en in nb.GetEdges())
            {
                var es = e._start.position;
                var ee = e._end.position;

                var ns = en._start.position;
                var ne = en._end.position;


                if (CloseEnough(es, ns) && CloseEnough(ee, ne) || CloseEnough(es, ne) && CloseEnough(ee, ns))
                {
                    AddSharedEdge(nb, e);
                    nb.AddSharedEdge(this, en);
                }
                if (!CloseEnough(es, ns) && !CloseEnough(ee, ne) && !CloseEnough(es, ne) && !CloseEnough(ee, ns))
                {
                    //if (_sharedBotEdgeDic.ContainsKey(nb))
                    //{
                    //    if (_sharedBotEdgeDic[nb].Contains(e))
                    //    {
                    //        _sharedBotEdgeDic[nb].Remove(e);
                    //        print("remove");
                    //    }
                    //}
                    //if (nb._sharedBotEdgeDic.ContainsKey(this))
                    //{
                    //    if (nb._sharedBotEdgeDic[this].Contains(en))
                    //    {
                    //        nb._sharedBotEdgeDic[this].Remove(en);
                    //        print("remove nb");
                    //    }
                    //}

                    if (MovablePoints.Contains(e._start) || MovablePoints.Contains(e._end))
                    {
                        continue;
                    }
                    else
                    {
                        MovablePoints.AddRange(e.GetPoints());
                    }

                    nb.MovablePoints.AddRange(en.GetPoints());
                }
            }

            if (_sharedBotEdgeDic.ContainsKey(nb))
            {
                if (_sharedBotEdgeDic[nb].Count == 0)
                {
                    _sharedBotEdgeDic.Remove(nb);
                }
            }

            if (nb._sharedBotEdgeDic.ContainsKey(this))
            {
                if (nb._sharedBotEdgeDic[this].Count == 0)
                {
                    _sharedBotEdgeDic.Remove(this);
                }
            }
        }
    }
Пример #8
0
    public TetraEdge GetSharedEdge(TetraBot nb, int edgeIndex)
    {
        int i = Mathf.Clamp(edgeIndex, 0, _sharedBotEdgeDic[nb].Count - 1);

        return(_sharedBotEdgeDic[nb][i]);
    }