С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Salty
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 6
#1

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

28.04.2013, 16:37. Просмотров 533. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2013, 16:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Графика: вращательное движение относительно центра экрана (C++):

Вращательное движение абсолютно твердого тела вокруг неподвижной оси - C++
Здравствуйте, помогите, пожалуйста, написать код. Нужно описать движение кабинки колеса обозрения или неподвижной педали велосипеда...

Поворот матрицы на 90 градусов относительно центра - C++
Как реализовать это в с++? И размерность матрицы задается пользователем (если да, то как?) или сразу же прописывается в программе (хотя в...

Получить суммы элементов симметричных относительно центра последовательности - C++
Дано дійсні числа а1,а2,...,а2n. Одержати a1+а2n, а2+а2n-1,...,аn+аn+1 Официальными языками форума являются русский и английский

Поменять местами элементы главной и побочной диагоналей, симметричные относительно центра матрицы - C++
Задана квадратичная матрица размером nxn поменять местами элементы главной и побочной диагоналей симметричные относительно центра...

Двумерный массив (Написать программу его поворота на 90 градусов относительно его центра) - C++
Дан массив A(n,n). Написать программу его поворота на 90 градусов относительно его центра. На печать вывести исходный и повернутый массивы....

Написать программу, демонстрирующую движение одной плоской фигуры относительно другой - C++
Ребята помогите! анимация, ни одной идеи в голове:cry: Написать программу, демонстрирующую движение одной плоской фигуры относительно...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2013, 16:37
Привет! Вот еще темы с ответами:

Графика в Си, немогу реализовать движение обЪекта - C++
Лыжника нарисовал но вот незнаю как осуществить его движение помогите плиз! #include &lt;stdio.h&gt; #include &lt;graphics.h&gt; #include...

dev c++ графика. Окраска экрана. - C++
&lt;graphics.h &gt;как окрасить экран на белый цвет???

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

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


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

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

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