// Обработка клика на кнопку 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(); }
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); }
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(); }
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(); }