Ejemplo n.º 1
0
        // Обработка клика на кнопку
        private void button_Click(object sender, RoutedEventArgs e)
        {
            /*
             *  1) init circle
             *  2) init worker
             *  3) add worker to list
             *  4) add circle to canvas
             *  5) run worker
             */


            // Создается новый шар с указанными (случайными) параметрами
            PhysicalCircle circle = new PhysicalCircle(new Ellipse
            {
                Height = 30,
                Width  = 30,
                Fill   = new SolidColorBrush(Color.FromArgb(255,
                                                            (byte)random.Next(0, 255),
                                                            (byte)random.Next(0, 255),
                                                            (byte)random.Next(0, 255))),
            }, new Position(0, 0));

            // Создается объект, который содержит поток для вычисления координат этого шара
            PhysicalCircleWorker worker = new PhysicalCircleWorker(circle, canvas, workers)
            {
                XSpeed = random.Next(minSpeed, maxSpeed),
                YSpeed = random.Next(minSpeed, maxSpeed),
            };

            // Отрисовывается шар и запускается поток
            workers.Add(worker);
            canvas.Children.Add(circle.Circle);

            worker.Start();
        }
Ejemplo n.º 2
0
        public static bool isCollised(PhysicalCircleWorker worker1, PhysicalCircleWorker worker2)
        {
            int minDistance  = worker1.Circle.Radius + worker2.Circle.Radius;
            int realDistance = Position.distanceBetween(worker1.CurrentPosition, worker2.CurrentPosition);

            if (realDistance < minDistance)
            {
                return(true);
            }
            return(false);
        }
Ejemplo n.º 3
0
        public static void collisionHandle(PhysicalCircleWorker worker1, PhysicalCircleWorker worker2)
        {
            int temp = worker1.XSpeed;

            worker1.XSpeed = worker2.XSpeed;
            worker2.XSpeed = temp;
            temp           = worker1.YSpeed;
            worker1.YSpeed = worker2.YSpeed;
            worker2.YSpeed = temp;

            worker1.oneStep();
            worker2.oneStep();
        }
Ejemplo n.º 4
0
        public void changePosition(object sender, EventArgs e)
        {
            if (CurrentPosition.x >= _canvas.Width)
            {
                XSpeed *= -1;
                while (CurrentPosition.x >= _canvas.Width)
                {
                    oneStep();
                }
            }
            if (CurrentPosition.x < _canvas.MinWidth)
            {
                XSpeed *= -1;
                while (CurrentPosition.x < _canvas.MinWidth)
                {
                    oneStep();
                }
            }
            if (CurrentPosition.y >= _canvas.Height)
            {
                YSpeed *= -1;
                while (CurrentPosition.y >= _canvas.Height)
                {
                    oneStep();
                }
            }
            if (CurrentPosition.y < _canvas.MinHeight)
            {
                YSpeed *= -1;
                while (CurrentPosition.y < _canvas.MinHeight)
                {
                    oneStep();
                }
            }

            foreach (PhysicalCircleWorker worker in anotherWorkers)
            {
                if (worker != this)
                {
                    if (PhysicalCircleWorker.isCollised(this, worker))
                    {
                        collisionHandle(worker, this);
                    }
                }
            }

            oneStep();
        }