//取得指定相鄰方向的格子 public T getNeighborCell <T>(Vector2Int _pos, ArrowFlag _arrow) where T : Tile { Dictionary <ArrowFlag, Vector2Int> neighborPosList = new Dictionary <ArrowFlag, Vector2Int>(); neighborPosList.Add(ArrowFlag.Top, new Vector2Int(0, 1)); neighborPosList.Add(ArrowFlag.Right, new Vector2Int(1, 0)); neighborPosList.Add(ArrowFlag.Bottom, new Vector2Int(0, -1)); neighborPosList.Add(ArrowFlag.Left, new Vector2Int(-1, 0)); return(getCell <T>(V2_V3(_pos + neighborPosList[_arrow]))); }
// //取得指定座標格的方向Flag ArrowFlag getCellRoadType(Vector2Int _pos) { ArrowFlag flag = ArrowFlag.None; List <ArrowFlag> flagList = new List <ArrowFlag>() { ArrowFlag.Top, ArrowFlag.Right, ArrowFlag.Bottom, ArrowFlag.Left }; for (int i = 0; i < flagList.Count; i++) { Cell targetCell = getNeighborCell <Cell>(_pos, flagList[i]); if (targetCell != null) { if (targetCell.isPassable) { flag = flag | flagList[i]; } } } return(flag); }
//由方向Flag轉換為對應Int int getRoadSpriteIndex(ArrowFlag _flag) { switch (_flag) { case ArrowFlag.Top | ArrowFlag.Bottom: return(0); //上下 case ArrowFlag.Right | ArrowFlag.Left: return(1); //左右 case ArrowFlag.Top | ArrowFlag.Right: return(2); //上右 case ArrowFlag.Top | ArrowFlag.Left: return(3); //上左 case ArrowFlag.Right | ArrowFlag.Bottom: return(4); //右下 case ArrowFlag.Left | ArrowFlag.Bottom: return(5); //左下 case ArrowFlag.Top | ArrowFlag.Right | ArrowFlag.Bottom: return(6); //上右下 case ArrowFlag.Top | ArrowFlag.Right | ArrowFlag.Left: return(7); //上右左 case ArrowFlag.Top | ArrowFlag.Bottom | ArrowFlag.Left: return(8); //上下左 case ArrowFlag.Right | ArrowFlag.Bottom | ArrowFlag.Left: return(9); //右下左 case ArrowFlag.Top | ArrowFlag.Right | ArrowFlag.Bottom | ArrowFlag.Left: return(10); //上右下左 case ArrowFlag.Top: return(11); //上 case ArrowFlag.Right: return(12); //右 case ArrowFlag.Bottom: return(13); //下 case ArrowFlag.Left: return(14); //左 default: return(0); } }
static void drawAndSave(string filename, Model model, string colorCode, int size, string optString) { // Create a Bitmap object from a file. Bitmap bitmap = new Bitmap(size, size); Graphics graphics = Graphics.FromImage(bitmap); int defaultStrike = size / 100; for (int i = 0; i < colorCode.Length; i++) { Char colorChar = colorCode[i]; if (colorChar == '_') { continue; } Color color = colorMap[colorChar]; Model.Polygen polygen = model.GetPolygen(i); Point[] points = polygen.Points; PointF[] scaledPoints = GetScaledPoints(points, size); graphics.FillPolygon(new SolidBrush(color), scaledPoints); int strike = polygen.GetStrikeSize(defaultStrike); if (strike > 0) { graphics.DrawPolygon(new Pen(Color.Black, strike), scaledPoints); } } if (optString != null) { Pen arrowPen = new Pen(Color.Black, defaultStrike); string modelArrow = model.GetArrow(optString); if (modelArrow != null) { optString = modelArrow; } string[] optStringArray = optString.Split(','); foreach (string optS in optStringArray) { String arrow = null; ArrowFlag flag = ArrowFlag.DEFAULT; if (optS.Contains("--->")) { arrow = "--->"; flag = ArrowFlag.EXTEND_START; } else if (optS.Contains("-->")) { arrow = "-->"; flag = ArrowFlag.DEFAULT; } else if (optS.Contains("->")) { arrow = "->"; flag = ArrowFlag.SHRINK_START; } else { throw new Exception("failed to parse data file."); } string[] numStr = optS.Split(new string[] { arrow }, StringSplitOptions.RemoveEmptyEntries); int first = int.Parse(numStr[0]); int second = int.Parse(numStr[1]); Model.Polygen firstPolygen = model.GetPolygen(first - 1); Point[] points = firstPolygen.Points; PointF[] scaledPoints = GetScaledPoints(points, size); PointF start = GetCenter(scaledPoints); Model.Polygen secondPolygen = model.GetPolygen(second - 1); points = secondPolygen.Points; scaledPoints = GetScaledPoints(points, size); PointF end = GetCenter(scaledPoints); drawArrow(start, end, graphics, arrowPen, size, flag); } } // Save bitmap.Save(filename); }
static void drawArrow(PointF start, PointF end, Graphics g, Pen pen, int size, ArrowFlag flag) { int arrowSize = size / 100 * 6; double radians = 0.0; if (start.X == end.X) { radians = Math.PI / 2 * (end.Y > start.Y ? 1 : -1); } else { radians = Math.Atan2(end.Y - start.Y, end.X - start.X); } int adjust = (flag == ArrowFlag.DEFAULT ? 0 : (flag == ArrowFlag.EXTEND_START ? 1 : -1)) * arrowSize; g.DrawLine( pen, (float)(start.X - adjust * Math.Cos(radians)), (float)(start.Y - adjust * Math.Sin(radians)), end.X, end.Y); PointF[] arrow = new PointF[] { new PointF((float)(end.X - Math.Sin(radians) * arrowSize / 2), (float)(end.Y + Math.Cos(radians) * arrowSize / 2)), new PointF((float)(end.X + Math.Sin(radians) * arrowSize / 2), (float)(end.Y - Math.Cos(radians) * arrowSize / 2)), new PointF((float)(end.X + Math.Cos(radians) * arrowSize / 2), (float)(end.Y + Math.Sin(radians) * arrowSize / 2)) }; g.FillPolygon(new SolidBrush(Color.Black), arrow); }