Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2013, 16:19   #1
Максим 116
Пользователь
 
Регистрация: 06.10.2013
Сообщений: 31
Восклицание Движение по кругу

В прикладном окне ездят несколько машин, которые движутся по кольцевой дороге в разных направлениях. Так же в этом окне есть объект-автозаправка, в котором может заправиться только одна машина в течение указанного времени. Автозаправщик отправляет машинам сообщение о том, что заправка свободна или занята. Машины устремляются к свободной заправке пытаясь «захватить» её. Если заправка занята, то машины продолжают своё движение.
Каждая машина объект с потоком, сообщающая перемещение и уведомление другим машинам о своей заправке.
Как описать движение авто по кругу?

Код:
using System;
using System.Collections;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;
 
namespace cs_KURSACH_stage1
{
    class Car //класс машины
    {
        public int speed;       //скорость машины
        public int capacity;    //емкость бензобака
        public string name;     //имя машины
        Point position;         //текущая позиция машины
        public int X            //свойство координаты X центра машины
        { get
            {
                return position.X - 10;
            }
        }
        public int Y       //свойство координаты Y центра машины
        {get
            {return position.Y - 10;}
        }
        bool onstation,          //признак нахождения на завправке
            onrefuel,            //признак заправки бензином 
            onroadtostation,     //признак движения к заправке
            oncircleroad,        //признак движения по кругу
            life;                //жизнь потока
        int indikator,           //индикатор наполнения бензобака
            max_indikator;       //максимальное значение индикатора
        Rectangle rpetrolstation;//место заправки
        Thread t;                //поток
        
         public Car(string Name, Rectangle rPetrolstation)
        {
            name = Name;
            rpetrolstation = rPetrolstation;
            speed = 2;
            position.X = rpetrostation.Right;
            position.Y = rpetrolstation.Top + rpetrolstation.Height / 2;
            capacity = 5;
            onstation = true;
            indikator = 0;
            max_indikator = 20;
            life = true;
            t = new Thread(new ThreadStart(Change_position));
            t.Start();
        }
           void Change_position() //движение
        {
            while (life)
            {
                if (onstation) OnStation();
                if (onrefuel) OnRefuel();
                if (onroadtostation) OnRoadtoStation();
                if (oncircleroad) OnCircleroad();
                Thread.Sleep(100);}
        } 
       void OnRoadtoStation() //движение к месту заправки
        {
            if (rpetrolstation.Contains(position.X, position.Y))
            {
                speed = -speed;
                onroadtostation = false;
                onstation = true;
                Console.WriteLine("onrefuel");
            }
            Changepos();
        }
         void OnStation() //действия на заправке
        {
            if (indikator != 0)
            {
                indikator--;
            }
            else
            {
                onstation = false;
                onrefuel = true;
                Console.WriteLine("onrefuel");
            }
            Console.WriteLine("X=" + position.X +
                " indikator=" + indikator);
        }
         void OnRefuel() //заправка машины
        {
            indikator++;
            if (indikator == max_indikator)
            {
                onrefuel = false;
                oncircleroad = true;
                Console.WriteLine("oncircleroad");
            }
            Console.WriteLine("X=" + position.X +
            " indikator=" + indikator);
        }
          void OnCircleroad() //движение по кругу
        {
            if (position.X < rpetrolstation.Right && position.X > rpetrolstation.Left
                && position.Y > rpetrolstation.Top && position.Y < rpetrolstation.Bottom)
            {
                speed = -speed;
                oncircleroad = false;
                onroadtostation = true;
                Console.WriteLine("onroadtostation");
            }
            Changepos();
        }
           void Changepos() //перемещение
        {
            position.X += speed;
            Console.WriteLine("X=" + position.X +
                " indikator=" + indikator);
        }
 
          public void Del()
        {
            life = false; }
    }
         class Mainwindow : Form      //класс главного окна
    {
        Thread t;                 //поток
        Rectangle rpetrolstation; //место базы
        bool life;                //жизнь потока
        Car l;                    //машина
           
/*Прописывается поток действий и рисование авто и заправки,пришлось убрать,из-за лимита символов.*/
    }
Максим 116 вне форума Ответить с цитированием
Старый 09.10.2013, 09:55   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Примитивный вариант, без учёта Вашей работы:
Код:
x = radius * Math.Cos(time);
y = radius * Math.Sin(time);
radius - радиус окружности, по которой движутся машинки, time - время в течение которого они движутся (у каждой машинки по идее своё время и оно должно расти неравномерно другим машинкам).
Можно добавить начальную фазу для старта с произвольной точки окружности, или ещё какие доп. параметры.

А вообще, лучше бы приложили весь проект архивом, а не кусок кода, который никому не нужен.
phomm вне форума Ответить с цитированием
Старый 09.10.2013, 15:12   #3
Максим 116
Пользователь
 
Регистрация: 06.10.2013
Сообщений: 31
По умолчанию

Файл с первой и второй стадией
Вложения
Тип файла: rar cs_KURSACH.rar (5.6 Кб, 71 просмотров)
Максим 116 вне форума Ответить с цитированием
Старый 10.10.2013, 09:23   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Пока для первого этапа сделал
Код:
int counter;       // время существования
void Change_position() //движение
        {
            while (life)
            {
                counter++;
                if (onstart) OnStart();
                if (onrefuel) OnRefuel();
                if (onroadtostation) OnRoadtoStation();
                if (oncircleroad) OnCircleroad();
                Thread.Sleep(100);
            }
        }
void Changepos() //перемещение
        {
            Point center = new Point(120, 100);
            position.X = center.X + (int)Math.Round(100 * Math.Cos(counter * 0.1 * speed));
            position.Y = center.Y + (int)Math.Round(100 * Math.Sin(counter * 0.1 * speed));
            Console.WriteLine("X=" + position.X +
                " indikator=" + indikator);
        }
Ездит по кругу типа ) и даже как-то глючно взаимодействует с заправкой.
С трудом разобрался за имеющееся короткое время в Вашем коде. Скажите, это ли Вам надо ?
phomm вне форума Ответить с цитированием
Старый 10.10.2013, 17:05   #5
Максим 116
Пользователь
 
Регистрация: 06.10.2013
Сообщений: 31
По умолчанию

Благодарю)
Сдвинулся с мертвой точки)
Постараюсь преобразовать для второй стадии,чтобы по прочерченной дороге перемещался.
Максим 116 вне форума Ответить с цитированием
Старый 16.10.2013, 19:01   #6
Максим 116
Пользователь
 
Регистрация: 06.10.2013
Сообщений: 31
По умолчанию

Как можно организовать встречное движение?для второй машины например?
Максим 116 вне форума Ответить с цитированием
Старый 17.10.2013, 17:50   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Зависит от того, как у Вас там сделано остальное ) В предудыщем варианте я с трудом разобрался )
По идее если встречное движение по кругу, то просто не прибавление а вычитание в формуле использовать и другие координаты центра.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение шарика по кругу Позитрон Общие вопросы Delphi 1 19.11.2012 20:23
цикл по кругу luffi Помощь студентам 1 01.03.2012 20:24
как проверить точка принадлежит кругу rostik123 Общие вопросы C/C++ 2 19.01.2012 11:54
движение по кругу SAMOUCHKA Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 10.11.2011 10:25
Движение объекта по кругу Roberto Помощь студентам 2 06.05.2008 15:44