Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> движение по кругу 
:(
    Опции темы
Lulikk
Дата 24.11.2010, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



Привет!

У меня есть проект, в котором несколько файлов.
В файлах описывается различные геометрические фигуры с разными параметрами.


Сначала надо было организовать просто движение любого из классов;

Код



void FigureMove(GeomFigure* pFig,int dx,int dy, int dtime, int count);
int main(void)
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, PATCHTODRIVER);
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

int maxx, maxy; maxx = getmaxx(); maxy = getmaxy();
int x0,y0; x0= maxx/2; y0=maxy/2;
Circle A1(50,300,240); A1.Draw();
ColorRect S1(30,50,150,100,2,3,4,5); S1.Draw(); getch();
ColorRect S2(0,360,200,100,BLUE,GREEN,RED,BROWN,YELLOW); S2.Draw();

FigureMove(&A1,15,5,750,12);

FigureMove(&S1,5, -3, 150, 20);
 getch();

closegraph();
return 0;


}

void FigureMove(GeomFigure* pFig,int dx,int dy, int dtime, int count)
{
    for(int i=1; i<=count; i++)
    {
    pFig->Draw();
    delay(dtime);               //    getch();
    pFig->Hide();
    pFig->Shift(dx,dy);

    }
 }




А теперь надо сделать движение по кругу. Причём класс ColorRect должен двигатся по классу Circle.


с этим возникли большие проблемы. 




Код


void FigureMovebyCircle(GeomFigure* pFig, int dtime,int x0,int y0,int Radius)
{

 Circle (320,240,50).Draw(); getch();
 setcolor(4);

const float PI=3.1416;
  int Width; int Height;
int x1=x0-Radius*6;
   int x2=Width/2;
   int y2=Height/2;


int y1=y0-Radius*6;
 /// int x0,y0;

pFig->Shift(x1,y1);
pFig->Draw();


for (double  f=0; f<=2*M_PI; f=f+PI/14)

 {
          double df=f*Radius;



 double dx=Radius*cos(f);
double dy=Radius*sin(f);

pFig->Draw();
delay(dtime);
pFig->Shift (dx,dy);

 }

    }



причём переменные x0 и y0 надо брать из класса Colorrect, но не получаеться сделать указатель.

Это сообщение отредактировал(а) Lulikk - 24.11.2010, 02:34
PM MAIL   Вверх
xvr
Дата 24.11.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



У вас есть 2 сущности - фигуры, которые можно двигать и процесс, управляющий движением. Напрашивается 2 базовых класса (Figure, MoveCtrl) и реализация того же Circle, как наследника их обоих

PM MAIL   Вверх
mes
Дата 24.11.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(xvr @  24.11.2010,  17:03 Найти цитируемый пост)
У вас есть 2 сущности - фигуры, которые можно двигать и процесс, управляющий движением. Напрашивается 2 базовых класса (Figure, MoveCtrl) и реализация того же Circle, как наследника их обоих

имхо, movectrl не наследник, а конечный класс на вход котрому попадают  фигура и путь..
по таймеру он запрашивает точку смещения у пути и туда перемещает фигуру..
удобнее будет, если фигура можгла бы возвращать путь...

Добавлено через 2 минуты и 32 секунды
поемотрел на код.. думаю я своим постом только запутал..

Добавлено через 6 минут и 7 секунд
сделайте функцию расчета координаты по долевому значению, если применительно к окружности то по углу.. 
после в цикле изменяйте угол и смещайте фигуру в полученную точку.. 



Это сообщение отредактировал(а) mes - 24.11.2010, 19:18


--------------------
PM MAIL WWW   Вверх
Lulikk
Дата 24.11.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



а есть какой нибудь пример???
\не совсем понимаю как это реализовать(


а как написать  функцию расчета координаты по долевому значению? есть формула?

Это сообщение отредактировал(а) Lulikk - 24.11.2010, 20:24
PM MAIL   Вверх
mes
Дата 24.11.2010, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Lulikk @  24.11.2010,  19:22 Найти цитируемый пост)
а как написать  функцию расчета координаты по долевому значению? есть формула?

как найти координаты точки на окружности по углу знаете ? вот его и используйте.. 



--------------------
PM MAIL WWW   Вверх
xvr
Дата 24.11.2010, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(mes @  24.11.2010,  19:18 Найти цитируемый пост)
имхо, movectrl не наследник, а конечный класс на вход котрому попадают  фигура и путь..
Нет, это именно базовый класс, и именно он и определяет путь. А фигуру для передвижения ему дают параметром.

Цитата(mes @  24.11.2010,  19:18 Найти цитируемый пост)
удобнее будет, если фигура можгла бы возвращать путь...
Вот собственно и возвращает (в виде наследования от movectrl)

Цитата(Lulikk @  24.11.2010,  20:22 Найти цитируемый пост)
а есть какой нибудь пример???

Код

class Figure {
public:

 virtual void move_to(int x, int y) =0;
};

class MoveCtrl {
public:
 virtual void move_setup(int total_steps, Figure*) =0;
 virtual void move() =0;
};

class Scene {
 vector<MoveCtrl*> movies;
public:

 void add(MoveCtrl* ctrl, Figure* fig, double speed=1.0)
  {
   ctrl->move_setup(1000/speed,fig);
   movies.push_back(ctrl);
  }

 void step()
  {
   for(size_t i=0;i<movies.size();++i)
    movies[i]->step();
  }
};


class Rect : public Figure, public MoveCtrl {
public:

 virtual void move_to(int x, int y);
 virtual void move_setup(int total_steps, Figure*);
 virtual void move();

};

class Circle : public ...


main()
{
  ...
  Circle c1(...);
  Rect r1(...);
  Circle c2(...);

  Scene S;
  S.add(&c1,&r1);
  S.add(&r1,&c2,3);

  for(;;) S.step();
}

Данная конструкция выводит картинку, где квадрат r1 летает по окружности c1, и по нему летает окружность c2 со скоростью в 3 раза больше

Методы:
 virtual void Figure::move_to(int x, int y); - Перемещает фигуру в точку x,y

 virtual void MoveCtrl::move_setup(int total_steps, Figure*); - Инициализирует перемещение. Задает количество шагов, за которое управляемая фигура должна осуществить полный оборот по пути. И задает фигуру, которая будет двигаться

 virtual void MoveCtrl::move(); - Осуществляет 1 шаг управляемой фигуры.


PM MAIL   Вверх
mes
Дата 24.11.2010, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(xvr @  24.11.2010,  20:11 Найти цитируемый пост)
Нет, это именно базовый класс, и именно он и определяет путь.

по мне как то не по себе, что контроллер движения ограничен определением конкретной фигуры.. 
но для простоты можно и так smile


--------------------
PM MAIL WWW   Вверх
xvr
Дата 24.11.2010, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(mes @  24.11.2010,  21:17 Найти цитируемый пост)
по мне как то не по себе, что контроллер движения ограничен определением конкретной фигуры..
А почему бы и нет? Кто лучше самой фигуры может знать, как обходить ее по периметру?
Можно конечно сделать Path (описатель пути), и класс (не базовый, а конкретный), который будет перемещать фигуру по Path. Но в данной задаче это явный перебор  smile 

PM MAIL   Вверх
mes
Дата 24.11.2010, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(xvr @  24.11.2010,  22:47 Найти цитируемый пост)
Кто лучше самой фигуры может знать, как обходить ее по периметру?

это да.. а вот как часто делать передвижения и с каким интервалом это совсем не фигурные знания.. 
а также двигать фигуру хватаясь за центр или другую точку или меняя точку прихвата на каждой итерации ?
 smile 

Это сообщение отредактировал(а) mes - 24.11.2010, 23:55


--------------------
PM MAIL WWW   Вверх
baldina
Дата 25.11.2010, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(Lulikk @  24.11.2010,  20:22 Найти цитируемый пост)
расчета координаты по долевому значению

необходимо представить функцию, описывающую фигуру, в параметрическом виде
например для окружности
x=x0+R*cos(t*2*pi)
y=y0+R*sin(t*2*pi)
x0, y0 - координаты центра
t принимает значения от 0 до 1

Напрашивается функция - член класса GeomFigure, которая возвращает координаты x,y по параметру t
ее можно использовать и в функции рисования фигуры, и для определения траектории
при этом производные классы - Circle, Rect могут вообще не содержать функцию рисования (пользоваться базовой)

Это сообщение отредактировал(а) baldina - 25.11.2010, 10:16
PM MAIL   Вверх
xvr
Дата 25.11.2010, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(mes @  24.11.2010,  23:54 Найти цитируемый пост)
это да.. а вот как часто делать передвижения и с каким интервалом это совсем не фигурные знания.. 
а также двигать фигуру хватаясь за центр или другую точку или меняя точку прихвата на каждой итерации ?
Если нужна такая функциональность, тогда да (как я уже писал - Path + отдельный контролер перемещения). Но у ТС даже та функциональность, что я описал ранее, не требовалась  smile 


PM MAIL   Вверх
Lulikk
Дата 25.11.2010, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



я когда цикл пишу, видимо с ошибкой, происходит движение по кругу, но не заданного радиуса, а зависит от того,насколько я делю окружность
PM MAIL   Вверх
baldina
Дата 25.11.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(Lulikk @  25.11.2010,  18:49 Найти цитируемый пост)
я когда цикл пишу


Цитата(Lulikk @  24.11.2010,  02:25 Найти цитируемый пост)

for (double  f=0; f<=2*M_PI; f=f+PI/14)
 {
     double df=f*Radius; // <<<<< тут
     double dx=Radius*cos(f);
     double dy=Radius*sin(f);

df=f*Radius
зачем угол на радиус умножается?
дальше df нигде не используется, но, может, нам не актуальный код показали?

PM MAIL   Вверх
Lulikk
Дата 25.11.2010, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 24.11.2010

Репутация: нет
Всего: нет



просто много вариантов было. забыла это срочку заккоментить.так всё верно
PM MAIL   Вверх
baldina
Дата 26.11.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



что-то вроде:

Код

struct point {
  double x, y;
  point (double x=0, double y=0) : x(x), y(y) {}
  point& operator+=(const point& p) { x += p.x; y += p.y; return *this; }
};

point operator+(const point& lhs, const point& rhs)
{
   point p(lhs);
   p += rhs;
   return p;
}

class GeomFigure {
  point origin;
public:
  virtual point get (double t) const = 0;
  void move (const point& distance) { origin += distance; }
  void draw () const
  {
     const int n = 100;
     point p = origin + get (0);
     move_to(p.x, p.y);
     for (int i=1; i < n; ++i)
     {
        p = origin + get (i/(n-1.));
        line_to (p.x, p.y);
    }
  }
};

class Circle : public GeomFigure {
  double radius;
 public:
   Circle (double r) : radius(r) {}
   point get (double t) const {
      point p;
      p.x = radius*cos(pi*2*t);
      p.y = radius*sin(pi*2*t);
      return p;
   }
};

void FigureMove (GeomFigure& fig,const GeomFigure& path, int dtime, int count)
{
    for(int i=0; i < count; ++i)
    {
      double t = i/(count-1.);
      fig.move(path.get(t));
      fig.draw();
      delay(dtime);
    }
}


писал тут, не проверял

Это сообщение отредактировал(а) baldina - 26.11.2010, 10:50
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0626 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.