Пример #1
0
        public void CreatePipe(IWorldNode target, PipeBlueprint.Orientation orientation)
        {
            NextLinkedNodes.Add(target);

            var p = new LevelNodePipe(Owner, this, target, orientation);

            OutgoingPipes.Add(p);
            Manager.AddEntity(p);
        }
Пример #2
0
        public LevelNodePipe(GameScreen scrn, IWorldNode start, IWorldNode end, PipeBlueprint.Orientation orientation)
            : base(scrn, GDConstants.ORDER_MAP_PIPE_ON)
        {
            NodeSource = start;
            NodeSink   = end;

            Position           = FPoint.MiddlePoint(start.Position, end.Position);
            DrawingBoundingBox = FSize.Diff(start.Position, end.Position) + new FSize(THICKNESS, THICKNESS);

            curvature = GetCurve(start, end, orientation);

            InitCurvature();
        }
Пример #3
0
        private void ManhattanLine(Graphics g, float x1, float y1, float x2, float y2, PipeBlueprint.Orientation o)
        {
            var dx = x2 - x1;
            var dy = y2 - y1;

            var p = new Pen(Color.SeaGreen, 24);

            if (o == PipeBlueprint.Orientation.Direct)
            {
                g.DrawLine(p, x1, y1, x2, y2);                 //D
                return;
            }

            if (dx < 0 && dy < 0)
            {
                if (o == PipeBlueprint.Orientation.Auto || o == PipeBlueprint.Orientation.Clockwise)
                {
                    g.DrawLine(p, x1, y1, x2, y1);                     //H
                    g.DrawLine(p, x2, y1, x2, y2);                     //V
                    return;
                }
                else
                {
                    g.DrawLine(p, x1, y1, x1, y2);                     //V
                    g.DrawLine(p, x1, y2, x2, y2);                     //H
                    return;
                }
            }

            if (dx >= 0 && dy < 0)
            {
                if (o == PipeBlueprint.Orientation.Auto || o == PipeBlueprint.Orientation.Counterclockwise)
                {
                    g.DrawLine(p, x1, y1, x2, y1);                     //H
                    g.DrawLine(p, x2, y1, x2, y2);                     //V
                    return;
                }
                else
                {
                    g.DrawLine(p, x1, y1, x1, y2);                     //V
                    g.DrawLine(p, x1, y2, x2, y2);                     //H
                    return;
                }
            }

            if (dx < 0 && dy >= 0)
            {
                if (o == PipeBlueprint.Orientation.Auto || o == PipeBlueprint.Orientation.Counterclockwise)
                {
                    g.DrawLine(p, x1, y1, x2, y1);                     //H
                    g.DrawLine(p, x2, y1, x2, y2);                     //V
                    return;
                }
                else
                {
                    g.DrawLine(p, x1, y1, x1, y2);                     //V
                    g.DrawLine(p, x1, y2, x2, y2);                     //H
                    return;
                }
            }

            if (dx >= 0 && dy >= 0)
            {
                if (o == PipeBlueprint.Orientation.Auto || o == PipeBlueprint.Orientation.Clockwise)
                {
                    g.DrawLine(p, x1, y1, x2, y1);                     //H
                    g.DrawLine(p, x2, y1, x2, y2);                     //V
                    return;
                }
                else
                {
                    g.DrawLine(p, x1, y1, x1, y2);                     //V
                    g.DrawLine(p, x1, y2, x2, y2);                     //H
                    return;
                }
            }

            throw new ArgumentException();
        }
Пример #4
0
 public void CreatePipe(IWorldNode target, PipeBlueprint.Orientation orientation)
 {
     throw new NotSupportedException();
 }
Пример #5
0
        private FlatCurve13 GetCurve(IWorldNode start, IWorldNode end, PipeBlueprint.Orientation o)
        {
            var cw     = (o == PipeBlueprint.Orientation.Clockwise);
            var ccw    = (o == PipeBlueprint.Orientation.Counterclockwise);
            var auto   = (o == PipeBlueprint.Orientation.Auto);
            var direct = (o == PipeBlueprint.Orientation.Direct);

            if (FloatMath.EpsilonEquals(start.Position.X, end.Position.X))
            {
                if (start.Position.Y < end.Position.Y)
                {
                    return(FlatCurve13.DOWN);
                }
                if (start.Position.Y > end.Position.Y)
                {
                    return(FlatCurve13.UP);
                }

                return(FlatCurve13.POINT);
            }

            if (FloatMath.EpsilonEquals(start.Position.Y, end.Position.Y))
            {
                if (start.Position.X < end.Position.X)
                {
                    return(FlatCurve13.RIGHT);
                }
                if (start.Position.X > end.Position.X)
                {
                    return(FlatCurve13.LEFT);
                }

                return(FlatCurve13.POINT);
            }

            if (start.Position.X < end.Position.X)
            {
                if (direct)
                {
                    return(FlatCurve13.DIRECT);
                }

                if (start.Position.Y < end.Position.Y)
                {
                    return((auto || cw) ? FlatCurve13.RIGHT_DOWN : FlatCurve13.DOWN_RIGHT);
                }
                else if (start.Position.Y > end.Position.Y)
                {
                    return((auto || ccw) ? FlatCurve13.RIGHT_UP : FlatCurve13.UP_RIGHT);
                }
            }

            if (start.Position.X > end.Position.X)
            {
                if (direct)
                {
                    return(FlatCurve13.DIRECT);
                }

                if (start.Position.Y < end.Position.Y)
                {
                    return((auto || ccw) ? FlatCurve13.LEFT_DOWN : FlatCurve13.DOWN_LEFT);
                }
                else if (start.Position.Y > end.Position.Y)
                {
                    return((auto || cw) ? FlatCurve13.LEFT_UP : FlatCurve13.UP_LEFT);
                }
            }

            throw new Exception("Invalid curvature found");
        }