//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(); }
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); }
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); } } }
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); } } }
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); }
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; }
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); } } } }
public TetraEdge GetSharedEdge(TetraBot nb, int edgeIndex) { int i = Mathf.Clamp(edgeIndex, 0, _sharedBotEdgeDic[nb].Count - 1); return(_sharedBotEdgeDic[nb][i]); }