Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 6
1

Графика: вращательное движение относительно центра экрана

28.04.2013, 16:37. Просмотров 861. Ответов 0
Метки нет (Все метки)

Здравствуйте! Нужна помощь в дописании программы.
Вот само задание: Вариант 3.
Для реализации вращательного движения относительно центра экрана удобно использовать полярную систему координат. Для этого в объект TPoint надо добавить переменные a, s типа float, которые соответственно задают угол (в радианах) и расстояние от центра экрана. Пусть эти переменные в конструкторе устанавливаются в 0 (то есть все объекты появляются в центре экрана).
Кроме того, переменные vx, vy надо заменить на переменные va, vs типа float, которые задаются приращения угла и расстояния соответственно. Значение va рекомендуется случайно выбирать в диапазоне от 0.01 до 0.1, а значение vs рекомендуется случайно выбирать в диапазоне от 0.1 до 1. Затем функцию obj[i]->MoveXY можно изменить так, чтобы у нее не было аргументов. Также содержимое этой функции надо изменить следующим образом. После вызова Hide надо изменить значения a, s на соответствующие приращения va, vs. После этого надо перейти от полярной системы координат к декартовой, то есть изменить значения целочисленных переменных x, y, а именно x:=floor(GrMaxX()/2+s*cos(a)); y:=floor(GrMaxY()/2-s*sin(a)); (это необходимо, так как отображение объектов выполняется на основе x, y). После этого осуществить вызов Show и закончить функцию obj[i]->MoveXY. Объекты будут совершать «вращательные» перемещения, но при этом они будут постепенно уходить за пределы экрана, а в окончательном варианте программы объекты
должны перемещаться только в пределах экрана. Чтобы объекты оставались в пределах экрана надо после вызова Hide внутри функции obj[i]->MoveXY добавить изменение значений va, vs на противоположные в том случае, если на следующем шаге расстояние от центра экрана будет больше половины высоты экрана. Кроме того, надо добавить некоторую «распределенность» при перемещении объектов. Для этого при перемещении каждого объекта можно иногда изменять случайным образом значения va, vs.
есть код программы, но не работает и не все условия заданы.
Код
#include <stdlib.h>
#include <time.h>
#include <grx20.h>
#include <grxkeys.h>
#include <math.h>
struct TPoint{
 int x,y;
 float a,s;
 float va, vs;
 int color;
 TPoint(int ix,int iy,int icolor);
 virtual ~TPoint();
 virtual void Draw(int icolor);
 void Show();
 void Hide();
 void MoveXY(int ix, int iy);
};
struct TBox: public TPoint{
 int w,h;
 TBox(int ix,int iy,int icolor,int iw,int ih);
 virtual ~TBox();
 virtual void Draw(int icolor);
};
struct TCircle: public TPoint{
 int r;
 TCircle(int ix,int iy,int icolor,int ir);
 virtual ~TCircle();
 virtual void Draw(int icolor);
};
TPoint::TPoint(int ix,int iy,int icolor)
{
 x=250; y=250;
 a=0; s=0;
 va=rand()%0,01-0,1; vs=rand()%0,1-1;
 color=icolor;
}
TPoint::~TPoint()
{
 Hide();
}
void TPoint::Draw(int icolor)
{
 GrPlot(x,y,icolor);
 GrPlot(x+1,y,icolor);
 GrPlot(x,y+1,icolor);
 GrPlot(x+1,y+1,icolor);
}
void TPoint::Show()
{
 Draw(color);
}
void TPoint::Hide()
{
 Draw(0);
}
void TPoint::MoveXY(int ix,int iy)
{
 Hide();
 if(ix>GrMaxX()){
 ix=ix-GrMaxX()-1;}
 if (ix<0) {
 ix=ix+GrMaxX()+1;}
 if(iy>GrMaxY()){
 iy=iy-GrMaxY()-1; }
 if(iy<0) {
 iy=iy+GrMaxY()+1; }
 x=ix; y=iy;
 a=va; s=vs;
 x=floor(GrMaxX()/2+s*cos(a)); y=floor(GrMaxY()/2-s*sin(a));
 Show();
}
TBox::TBox(int ix,int iy,int icolor,int iw,int ih):
 TPoint(ix,iy,icolor)
{
 w=iw; h=ih;
}
TBox::~TBox()
{
 Hide();
}
void TBox::Draw(int icolor)
{
 GrBox(x-w/2,y-h/2,x+(w-w/2),y+(h-h/2),icolor);
}
TCircle::TCircle(int ix,int iy,int icolor,int ir):
 TPoint(ix,iy,icolor)
{
 r=ir;
}
TCircle::~TCircle()
{
 Hide();
}
void TCircle::Draw(int icolor)
{
 GrCircle(x+2,y+5,r-1,icolor);
}
#define M 10000
main()
{ int N=10;
    TPoint *obj[M];

 GrSetMode(GR_default_graphics,1024,768);
 srand(time(0));
 int i;
 int count;
 for(i=0;i<N;i++){
     count=rand()%3;
 switch(count)
 {case 1:
 obj[i]=new TBox(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15,rand()%10,rand()%10);break;
 case 2:
 obj[i]=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15 ,rand()%20);break;
 default:
 obj[i]=new TPoint(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15) ;};
 obj[i]->Show();
 }
GrKeyType key;
int s;
 do{
  while (!GrKeyPressed()){
   GrSleep(5);
   for(i=0;i<N;i++){
       s=rand()%100;
    if (s=50)
    obj[i]->MoveXY(obj[i]->a+obj[i]->va, obj[i]->s+obj[i]->vs);}}//rand()%7-3,obj[i]->y+rand()%7-3);

  key=GrKeyRead();
  switch(key){
case GrKey_Insert:
if (N<M){
    for(i=0;i<N;i++){
 count=rand()%3;
 switch(count)
 {case 1:
 obj[N]=new TBox(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15,rand()%10,rand()%10);break;
 case 2:
 obj[N]=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15 ,rand()%20);break;
 default:
 obj[N]=new TPoint(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15) ;};
 obj[i]->Show();
 }

N++; //количество объектов увеличивается
}
break;
case GrKey_Delete:
if (N>0){
delete obj[N-1];
N--; //количество объектов уменьшается
}
break;
}

 }while(key!=GrKey_Escape);
for(i=0;i<N;i++){
  delete obj[i];
 }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2013, 16:37
Ответы с готовыми решениями:

Движение картинки от центра экрана — по диагоналям ко всем углам экрана с уменьшением размера
нужно чтобы картинка двигалась от центра экрана - по диагоналям ко всем углам экрана с уменьшением...

Движение шара: удаление от нас из центра экрана
Разработать программу C#. которая демонстрирует на экране движение шара: шар улетает от нас из...

Вращательное движение (движение бусины по спице перпендикулярно оси вращения)
В учебниках хорошо рассмотренно движение материальной точки при круговом вращении, однако не...

Программа, которая рисует изменение шара (рост от центра до границ экрана или уменьшение от границ экрана до центра)
Написать программу, которая спрашивает у пользователя, как должен вести себя шар: 1 –расти из...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.04.2013, 16:37

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вращательное движение
Шар радиуса R вращается с угловой скоростью ω (на рисунке по часовой) на горизонтальной плоскости,...

вращательное движение
Два одинаковых груза массой m подвешены к вертикальной оси на нитях длиной h. Определить их...

Вращательное движение
https://www.cyberforum.ru/attachment.php?attachmentid=202766&amp;stc=1&amp;d=1353343245 Числовые данные:...

Вращательное движение
Диск подвешен на упругой нити над другим вращающимся диском на расстоянии h=1 см. Частота вращения...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.