Ejemplo n.º 1
0
        //Line between two points.
        public void DrawWithPen(double x1, double y1, double x2, double y2)
        {
            //Add new drawing line to linebatch.
            _penLineBatch.Add(new LightLine {
                X1 = x1, X2 = x2, Y1 = y1, Y2 = y2
            });

            //Update graph to apply changes.
            Update();
        }
Ejemplo n.º 2
0
        //Draws the pendulum bobs.
        public override void Draw(State state)
        {
            //Sets width and height to canvas height and width propeties depending on
            //if the canvas is initialised.
            var width  = Canvas.ActualWidth > 0 ? Canvas.ActualWidth : Canvas.Width;
            var height = Canvas.ActualHeight > 0 ? Canvas.ActualHeight : Canvas.Height;

            //Calaculate bob position.
            BobPosition.X = Length * Math.Sin(state.Displacement);
            BobPosition.Y = Length * Math.Cos(state.Displacement);

            PivotPosition = new Vec2
            {
                X = width / 2,
                Y = height / 2
            };

            Batches.Add(DrawingMethods.FilledCircle(PivotPosition, 4, Brushes.Black));

            //Calculate bob position relative to the canvas coordinates.
            BobPosCanvas.X = PivotPosition.X + BobPosition.X * PixelsPerMeter;
            BobPosCanvas.Y = PivotPosition.Y + BobPosition.Y * PixelsPerMeter;


            //Create line objects for pendulum arm.
            var arm = new LightLine
            {
                X1 = PivotPosition.X,
                Y1 = PivotPosition.Y,
                X2 = BobPosCanvas.X - BobRadius * Math.Sin(state.Displacement),
                Y2 = BobPosCanvas.Y - BobRadius * Math.Cos(state.Displacement)
            };

            var armLineBatch = new LineBatch {
                LineThickness = 2
            };

            armLineBatch.Add(arm);
            Batches.Add(armLineBatch);

            //Draw origin circles depending on whether interaction is taking place.
            Batches.Add(IsInteracting
                ? DrawingMethods.FilledCircle(BobPosCanvas, (int)BobRadius, Brushes.Red)
                : DrawingMethods.FilledCircle(BobPosCanvas, (int)BobRadius, Brushes.Blue));

            //Render the batches.
            foreach (var batch in Batches)
            {
                batch.Render(Canvas);
                batch.Clear();
            }

            Batches.Clear();
        }
Ejemplo n.º 3
0
        //Line between two points (temporary).
        public void DrawTempLine(double x1, double y1, double x2, double y2)
        {
            //Add new temporary line to linebatch.
            _templineBatch.Add(new LightLine {
                X1 = x1, X2 = x2, Y1 = y1, Y2 = y2
            });

            //Update graph to apply changes.
            Update();

            //Clear the the temporary line batch.
            ClearTempLineBatch();
        }
Ejemplo n.º 4
0
        //Draws the pendulum bobs.
        public void Draw()
        {
            //Sets width and height to canvas height and width propeties depending on
            //if the canvas is initialised.
            var width  = _canvas.ActualWidth > 0 ? _canvas.ActualWidth : _canvas.Width;
            var height = _canvas.ActualHeight > 0 ? _canvas.ActualHeight : _canvas.Height;

            //Calaculate bob position.
            _bobPosition[0].X = Length[0] * Math.Sin(CurrentState[0].Displacement);
            _bobPosition[0].Y = Length[0] * Math.Cos(CurrentState[0].Displacement);
            _bobPosition[1].X = Length[1] * Math.Sin(CurrentState[1].Displacement);
            _bobPosition[1].Y = Length[1] * Math.Cos(CurrentState[1].Displacement);

            _pivotPosition = new Vec2
            {
                X = width / 2,
                Y = height / 2
            };

            _batches.Add(DrawingMethods.FilledCircle(_pivotPosition, 4, Brushes.Black));

            //Calculate bob position relative to the canvas coordinates.
            _bobPositionCanvas[0].X = _pivotPosition.X + _bobPosition[0].X * PixelsPerMeter;
            _bobPositionCanvas[0].Y = _pivotPosition.Y + _bobPosition[0].Y * PixelsPerMeter;
            _bobPositionCanvas[1].X = _bobPositionCanvas[0].X + _bobPosition[1].X * PixelsPerMeter;
            _bobPositionCanvas[1].Y = _bobPositionCanvas[0].Y + _bobPosition[1].Y * PixelsPerMeter;



            //Create line objects for both pendulum arms.
            var arm1 = new LightLine
            {
                X1 = _pivotPosition.X,
                Y1 = _pivotPosition.Y,
                X2 = _bobPositionCanvas[0].X - BobRadius * Math.Sin(CurrentState[0].Displacement),
                Y2 = _bobPositionCanvas[0].Y - BobRadius * Math.Cos(CurrentState[0].Displacement)
            };

            var arm2 = new LightLine
            {
                X1 = _bobPositionCanvas[0].X,
                Y1 = _bobPositionCanvas[0].Y,
                X2 = _bobPositionCanvas[1].X - BobRadius * Math.Sin(CurrentState[1].Displacement),
                Y2 = _bobPositionCanvas[1].Y - BobRadius * Math.Cos(CurrentState[1].Displacement)
            };


            var armLineBatch = new LineBatch();

            armLineBatch.LineThickness = 2;
            armLineBatch.Add(arm1);
            armLineBatch.Add(arm2);
            _batches.Add(armLineBatch);

            //Draw origin circles depending on whether interaction is taking place.
            _batches.Add(IsInteractingTop
                ? DrawingMethods.FilledCircle(_bobPositionCanvas[0], (int)BobRadius, Brushes.Red)
                : DrawingMethods.FilledCircle(_bobPositionCanvas[0], (int)BobRadius, Brushes.Blue));

            _batches.Add(IsInteractingBottom
                ? DrawingMethods.FilledCircle(_bobPositionCanvas[1], (int)BobRadius, Brushes.Red)
                : DrawingMethods.FilledCircle(_bobPositionCanvas[1], (int)BobRadius, Brushes.Blue));

            //If DrawTrails is equal to true draw pendulum trails.
            if (DrawTrails)
            {
                var trailLine = new LightLine
                {
                    X1 = (int)_bobPositionCanvas[1].X,
                    Y1 = (int)_bobPositionCanvas[1].Y,
                    X2 = (int)_bobPositionCanvas[1].X,
                    Y2 = (int)_bobPositionCanvas[1].Y
                };

                //Clean up.
                if (_trailLinesQueue.IsFull())
                {
                    _trailLinesQueue.DeQueue();
                }

                _trailLinesQueue.EnQueue(trailLine);
                _trail.Add(_trailLinesQueue.GetItems());
                _batches.Add(_trail);
            }


            //Render the batches.
            foreach (var batch in _batches)
            {
                batch.Render(_canvas);
                batch.Clear();
            }

            _batches.Clear();
        }
Ejemplo n.º 5
0
        //Draws the pendulum bobs.
        public override void Draw(State state)
        {
            var springLength = (Length + state.Displacement) * PixelsPerMeter - ConnectorLength * 2;
            var coilSpan     = springLength / NumberOfCoils;
            var multiplier   = -1;


            //Sets width and height to canvas height and width propeties depending on
            //if the canvas is initialised.
            var width  = Canvas.ActualWidth > 0 ? Canvas.ActualWidth : Canvas.Width;
            var height = Canvas.ActualHeight > 0 ? Canvas.ActualHeight : Canvas.Height;

            BobPosition.Y = Length + state.Displacement;

            PivotPosition = new Vec2
            {
                X = width / 2,
                Y = 10
            };
            Batches.Add(DrawingMethods.FilledCircle(PivotPosition, 4, Brushes.Black));

            //Calaculate bob position.
            BobPosCanvas.X = PivotPosition.X;
            BobPosCanvas.Y = PivotPosition.Y + BobPosition.Y * PixelsPerMeter + BobRadius;

            #region DrawSpring

            var springlineBatch = new LineBatch();
            var springPivotLine = new LightLine()
            {
                X1 = PivotPosition.X,
                Y1 = PivotPosition.Y,
                X2 = PivotPosition.X,
                Y2 = PivotPosition.Y + ConnectorLength
            };
            springlineBatch.Add(springPivotLine);

            var theta = Math.Asin(coilSpan / 2 / CoilDiameter);
            var x     = (CoilDiameter * Math.Cos(theta) / 2);

            var startLine = new LightLine()
            {
                X1 = PivotPosition.X,
                Y1 = PivotPosition.Y + ConnectorLength,
                X2 = PivotPosition.X + x,
                Y2 = PivotPosition.Y + ConnectorLength + coilSpan / 2
            };
            springlineBatch.Add(startLine);
            var tempLine = startLine;


            for (int i = 0; i < (NumberOfCoils - 1) * 2; i++)
            {
                var coilLine = new LightLine()
                {
                    X1 = tempLine.X2,
                    Y1 = tempLine.Y2,
                    X2 = tempLine.X2 + 2 * x * multiplier,
                    Y2 = tempLine.Y2 + coilSpan / 2,
                };

                springlineBatch.Add(coilLine);
                tempLine    = coilLine;
                multiplier *= -1;
            }

            var endLine = new LightLine()
            {
                X1 = tempLine.X2,
                Y1 = tempLine.Y2,
                X2 = tempLine.X2 + x * multiplier,
                Y2 = tempLine.Y2 + coilSpan / 2
            };
            springlineBatch.Add(endLine);

            var springBobLine = new LightLine()
            {
                X1 = endLine.X2,
                Y1 = endLine.Y2,
                X2 = endLine.X2,
                Y2 = endLine.Y2 + ConnectorLength
            };
            springlineBatch.Add(springBobLine);

            #endregion

            springlineBatch.LineThickness = 2;
            Batches.Add(springlineBatch);

            //Draw origin circles depending on whether interaction is taking place.
            Batches.Add(IsInteracting
                ? DrawingMethods.FilledCircle(BobPosCanvas, (int)BobRadius, Brushes.Red)
                : DrawingMethods.FilledCircle(BobPosCanvas, (int)BobRadius, Brushes.Blue));


            //Render the batches.
            foreach (var batch in Batches)
            {
                batch.Render(Canvas);
                batch.Clear();
            }

            Batches.Clear();
        }