Beispiel #1
0
    /**
     * 指定された線路と隣接するタスクの内、右向き正とした角度がもっとも大きいタスクを返します
     * これは線路を分岐させたとき、どの分岐先を選べばよいか判定するためのものです
     */
    private LineTask FindFarLeft(RailEdge re)
    {
        if (Top == null)
        {
            return(null);
        }
        // セルフループの場合自身を返す
        if (Top.Next == Top)
        {
            if (!Top.IsNeighbor(re))
            {
                throw new ArgumentException("top is not neighbored edge");
            }
            return(Top);
        }
        // 隣接するタスクを絞り込む
        var neighbors = FilterNeighbors(re);

        if (neighbors.Count == 0)
        {
            throw new ArgumentException("edge is not any neighbored");
        }
        // 候補が複数ある場合、距離0の移動タスクは角度の計算ができないのでスキップ
        var candidates = FilterOutUnangled(neighbors);

        // 次のタスクへの回転角が最も大きいものを返す
        return(FindLargestAngle(candidates, re));
    }
Beispiel #2
0
        public IEnumerator AngleErrorOnlyDeptTask()
        {
            yield return(null);

            var rn = utils.factory.NewRailNode(new Vector3(0f, 0f));

            yield return(null);

            var p = rn.BuildStation();

            yield return(null);

            var re = rn.Extend(new Vector3(1f, 1f));

            yield return(null);

            var l    = new RailLine(utils.storage, utils.listener);
            var dept = new DeptTask(utils.storage, utils.listener, l, p);

            Assert.True(dept.IsNeighbor(re));
            Assert.Throws <ArgumentException>(() => dept.SignedAngle(re));
        }