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