예제 #1
0
 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]);
     }
 }
예제 #2
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);
    }