public void CreatFromLog() { LogScript.LogClass log = LogScript.Instance.ReadLog(); if (log != null) { CreatPoints(log.AllPointsNum); List <Vector2Int> point = new List <Vector2Int>(); for (int i = 0; i < log.pointList.Count; i++) { point.Add(new Vector2Int(log.pointList[i].x, log.pointList[i].y)); } AddLineRenderer2InUseList(point); foreach (var lineRenderer in linesInUseDic) { lineRenderer.Value.SetPositions(new Vector3[] { AllUsePoints[lineRenderer.Key.x].Position, AllUsePoints[lineRenderer.Key.y].Position }); } OnPointMove(AllUsePoints[0]); } }
private List <Vector2Int> GetLinePositionByPointNumInRandom(int pointNum) { if (pointNum <= 1) { return(null); } if (pointNum == 2) { return(new List <Vector2Int>() { new Vector2Int(0, 1) }); } LogScript.LogClass log = new LogScript.LogClass(); log.AllPointsNum = pointNum; //最少三点做圈 int circleNum = Random.Range(3, pointNum); log.circleNum = circleNum; List <Vector2Int> ret = new List <Vector2Int>(); for (int i = 0; i < circleNum; i++) { Vector2Int temp = new Vector2Int(0, i); // 做首尾相连 if (i + 1 < circleNum) { ret.Add(new Vector2Int(i, i + 1)); } //移除最大点后的 最大点与起始点相连 else if (!ret.Contains(temp))//主要是2点的时候 其他不会重复 { ret.Add(temp); } } int leftNum = pointNum - circleNum; int insideAndOutSideNum = 0; //内外各一点 剩余做两点插入 if (leftNum > 2) { insideAndOutSideNum = 2; leftNum -= 2; } else { insideAndOutSideNum = leftNum; leftNum = 0; } log.insideAndOutSideNum = insideAndOutSideNum; //leftNum = 0 1 2 for (int i = 0; i < insideAndOutSideNum; i++) { int pointId = circleNum + i; //这个点加几条线 最少也得连俩 = = int lineNum = Random.Range(2, circleNum); for (int j = 0; j < lineNum; j++) { //这些线连到那些点 int p = Random.Range(0, circleNum); Vector2Int v = new Vector2Int(p, pointId); while (ret.Contains(v)) { p = Random.Range(0, circleNum - 1); v = new Vector2Int(p, pointId); } if (!ret.Contains(v)) { ret.Add(v); } } } log.leftNum = leftNum; //leftNum 剩下的点全部做 两点间插入 for (int i = 0; i < leftNum; i++) { int pointId = insideAndOutSideNum + circleNum + i; int pointid = Random.Range(0, pointNum - leftNum); foreach (var vector2Int in ret) { if (vector2Int.x == pointid || vector2Int.y == pointid) { if (Random.Range(0, 1) == 0) { ret.Add(new Vector2Int(vector2Int.x, pointId)); ret.Add(new Vector2Int(vector2Int.y, pointId)); break; } } } } log.pointList = ret; //两点随意放 //三点只能放两个,多了或者四点就可能存在无解情况 //多了无所谓,N点只能放两个。重点是两个 内外各一个 LogScript.Instance.WriteLog(log); return(ret); }