Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Salty
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 6
28.04.2013, 16:37     Графика: вращательное движение относительно центра экрана #1
Здравствуйте! Нужна помощь в дописании программы.
Вот само задание: Вариант 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];
 }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2013, 16:37     Графика: вращательное движение относительно центра экрана
Посмотрите здесь:

Графика в Си, немогу реализовать движение обЪекта C++
C++ поиск центра графа
dev c++ графика. Окраска экрана. C++
Двумерный массив (Написать программу его поворота на 90 градусов относительно его центра) C++
C++ Написать игру. В верхней части экрана летят 3 «звездочки»(***). В нижнем правом углу экрана находиться буква «О»
C++ Поворот матрицы на 90 градусов относительно центра
C++ Получить суммы элементов симметричных относительно центра последовательности
Поворот треугольника (вокруг центра) C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 12:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru