Консультация № 187304
28.04.2013, 16:31
0.00 руб.
0 0 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];
}
}

Обсуждение

Форма ответа