void getEdges(LinkedList<Ray> rays, LinkedList<Arc> arcs) { foreach (AxisDirection dir in Enum.GetValues(typeof(AxisDirection))) { if (!canGoInDirection(dir)) { var sideCenter = center + new Vector(dir) * (Constants.tileSize * 0.5 - Constants.roadMargin); var sideHalfLength = (Constants.tileSize * 0.5 - Constants.roadMargin * 2); var side = Ray.line( sideCenter + new Vector(dir.turnLeft()) * sideHalfLength, sideCenter + new Vector(dir.turnRight()) * sideHalfLength ); rays.AddLast(side); } var nextDir = dir.turnLeft(); if (!canGoInDirection(dir) && !canGoInDirection(nextDir)) { var arcCenter = center + (new Vector(dir) + new Vector(nextDir)) * (Constants.tileSize * 0.5 - Constants.roadMargin * 2); var arc = new Arc(arcCenter, Constants.roadMargin, nextDir.angle(), dir.angle()); arcs.AddLast(arc); } else if (canGoInDirection(dir) && canGoInDirection(nextDir)) { var arcCenter = center + (new Vector(dir) + new Vector(nextDir)) * (Constants.tileSize * 0.5); var arc = new Arc(arcCenter, Constants.roadMargin, nextDir.back().angle(), dir.back().angle()); arcs.AddLast(arc); } else if (!canGoInDirection(dir) && canGoInDirection(nextDir)) { var lineFrom = center + (new Vector(dir) + new Vector(nextDir)) * (Constants.tileSize * 0.5); lineFrom = lineFrom - (new Vector(dir) * Constants.roadMargin); var side = new Ray(lineFrom, new Vector(nextDir.back()) * Constants.roadMargin * 2); rays.AddLast(side); } else if (canGoInDirection(dir) && !canGoInDirection(nextDir)) { var lineFrom = center + (new Vector(dir) + new Vector(nextDir)) * (Constants.tileSize * 0.5); lineFrom = lineFrom - (new Vector(nextDir) * Constants.roadMargin); var side = new Ray(lineFrom, new Vector(dir.back()) * Constants.roadMargin * 2); rays.AddLast(side); } } }
public bool isIntersect(Arc arc) { foreach (AxisDirection dir in Enum.GetValues(typeof(AxisDirection))) { var edge = edgeInDirection(dir); if (arc.intersect(edge) != null) { return true; } } return false; }