/** * 指定された線路と隣接するタスクの内、右向き正とした角度がもっとも大きいタスクを返します * これは線路を分岐させたとき、どの分岐先を選べばよいか判定するためのものです */ 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)); }
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)); }