private IEnumerator FixCoorinate(Action endCall) { foreach (var VARIABLE in _roomInfos) { VARIABLE.AddRigidbody2D(); } while (!AllRoomSleep()) { yield return(new WaitForFixedUpdate()); } Debug.Log("开始坐标休整"); foreach (var VARIABLE in _roomInfos) { VARIABLE.Rigidbody2D.constraints = RigidbodyConstraints2D.FreezeAll; VARIABLE.Pos = new Vector3(GridSize * ((int)(VARIABLE.Pos.x / GridSize)), GridSize * ((int)(VARIABLE.Pos.y / GridSize)), VARIABLE.Pos.z); //Point和room映射 point2Room.Add(PointMgr.GetPoint(VARIABLE.Pos), VARIABLE); } Debug.Log("坐标休整完成"); endCall?.Invoke(); }
private void ConnectRooms() { foreach (var line in minTreeLines) { #region 房屋互相联系起来 var points = line.pointIds; var p1 = PointMgr.GetPoint(points[0]); var p2 = PointMgr.GetPoint(points[1]); var room1 = point2Room[p1]; var room2 = point2Room[p2]; room1.AddClosedRoom(room2); room2.AddClosedRoom(room1); #endregion var posType = RoomInfo.GetPointPosType(room1, room2); print(room1.obj.name + " " + room2.obj.name + " " + posType); switch (posType) { case RoomInfo.PosType.Cross: break; case RoomInfo.PosType.Null: var dir = room2.Pos - room1.Pos; break; case RoomInfo.PosType.Ymid: var heightRange = new Vector2( Mathf.Max(room1.Down, room2.Down) + GridSize * pathWidth / 2, Mathf.Min(room1.Up, room2.Up) - GridSize * pathWidth / 2); var minRight = Mathf.Min(room1.Right, room2.Right); var maxLeft = Mathf.Max(room1.Left, room2.Left); var height = Random.Range(heightRange.x, heightRange.y); var hh = height + GridSize * pathWidth / 2; var lh = height - GridSize * pathWidth / 2; Debug.Log(heightRange); Debug.Log(minRight); Debug.Log(maxLeft); for (var i = minRight; i < maxLeft; i += 0.5f * GridSize) { tilemap.SetTile(new Vector3Int(Mathf.RoundToInt(i), Mathf.RoundToInt(hh), 0), pathTile); tilemap.SetTile(new Vector3Int(Mathf.RoundToInt(i), Mathf.RoundToInt(lh), 0), pathTile); } break; case RoomInfo.PosType.Xmid: var widthRange = new Vector2( Mathf.Max(room1.Left, room2.Left) + GridSize * pathWidth / 2, Mathf.Min(room1.Right, room2.Right) - GridSize * pathWidth / 2); var minUp = Mathf.Min(room1.Up, room2.Up); var maxDown = Mathf.Max(room1.Down, room2.Down); var width = Random.Range(widthRange.x, widthRange.y); var lw = width - GridSize * pathWidth / 2; var rw = width + GridSize * pathWidth / 2; for (var i = minUp; i < maxDown; i += 0.5f * GridSize) { tilemap.SetTile(new Vector3Int(Mathf.RoundToInt(lw), Mathf.RoundToInt(i), 0), pathTile); tilemap.SetTile(new Vector3Int(Mathf.RoundToInt(rw), Mathf.RoundToInt(i), 0), pathTile); } break; } } }
/// <summary> /// 二维三角剖分算法 /// </summary> /// <param name="vertices"></param> /// <returns></returns> public static List <Triangle> Delaunay2D(List <Vector2> vertices) { var pointList = new List <Point>(); #region 初始化顶点列表 foreach (var VARIABLE in vertices) { pointList.Add(PointMgr.GetPoint(VARIABLE)); } pointList.Sort(); #endregion #region 获取超级三角形 float l = pointList[0].pos.x; float r = pointList[pointList.Count - 1].pos.x; float u = pointList[0].pos.y; float d = pointList[0].pos.y; foreach (var VARIABLE in pointList) { if (VARIABLE.pos.y < d) { d = VARIABLE.pos.y; } if (VARIABLE.pos.y > u) { u = VARIABLE.pos.y; } } var width = r - l; var hight = u - d; if (width < hight) { width = hight; } var top = new Vector3((l + r) / 2, u + hight, 0); var left = new Vector3((l + r) / 2 - width - 5, d - 5, 0); var right = new Vector3((l + r) / 2 + width + 5, d - 5, 0); var superTriangle = TriangleMgr.GetTriangle(top, left, right); #endregion var targetTriangles = new List <Triangle>(); var tempTriangles = new List <Triangle>(); //将超级三角形加入临时三角形队列 tempTriangles.Add(superTriangle); targetTriangles.Add(superTriangle); for (var i = 0; i < pointList.Count; i++) { var point = pointList[i]; var edgeBuffer = new List <Line>(); for (var j = 0; j < tempTriangles.Count; j++) { var triangle = tempTriangles[j]; var outCircle = triangle.GetOutCircle(); //如果在园内,说明,当前三角形不是Delaunay三角形 if (outCircle.ContansPoint(point)) { //将三边加入边缓存 foreach (var edge in triangle.Edges) { //判断是否重复 bool add = true; foreach (var VARIABLE in edgeBuffer) { if (VARIABLE == edge) { add = false; } } if (add) { edgeBuffer.Add(edge); } else { edgeBuffer.Remove(edge); } } //移除当前三角形 tempTriangles.RemoveAt(j); j--; }//如果点在外接圆右侧,说明当前三角形是Delaunay三角形 else if (point.pos.x > outCircle.CenterPos.x + outCircle.radius) { targetTriangles.Add(triangle); tempTriangles.RemoveAt(j); j--; } } //当前点和缓存边相连构成三角形 foreach (var edge in edgeBuffer) { tempTriangles.Add(TriangleMgr.GetTriangle(point, edge)); } } //合并targetTriangles 和TempTriangles foreach (var t in tempTriangles) { if (targetTriangles.Contains(t) == false) { targetTriangles.Add(t); } } //除去与超级三角形有关的三角形 for (var i = 0; i < targetTriangles.Count; i++) { var triangle = targetTriangles[i]; var edges = triangle.Points; foreach (var superEdge in superTriangle.Points) { if (edges.Contains(superEdge)) { targetTriangles.RemoveAt(i); i--; break; } } } return(targetTriangles); }