Показать сообщение отдельно
Старый 28.05.2012, 18:10   #2 (permalink)
brokilone
Member
 
Регистрация: 03.01.2012
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Кой-чего сама доделала, а именно вот этот пункт:
Перемещение «ведущего» объекта остается без изменений, а перемеще-ние «ведомых» объектов для начала можно сделать следующим образом. Перед вызовом obj[i]->MoveXY при i>0 надо изменять значения obj[i]->vx и obj[i]->vy так, чтобы вектор скорости был направлен к «ведущему» объекту. Например, obj[i]->vx можно установить равным 10-й части разности между координатой x «ведущего» объекта и координатой x объекта obj[i] (аналогично для obj[i]->vy). После этого «ведомые» объекты будут следовать за «ведущим», но не будет требуемой случайности и «распределенности».
Для привнесения элемента случайности в перемещения «ведомых» объ-ектов надо к значениям obj[i]->vx и obj[i]->vy прибавлять небольшие случай-ные значения, например, rand()%7-3.
Посему выкладываю заново код. Но вот распределенность не могу реализовать. Отзовитесь, прошу! Тут капельку осталось!
#include <stdlib.h>
#include <time.h>
#include <grx20.h>
#include <grxkeys.h>
#include <stdio.h>
#include <math.h>
struct TPoint{
int x,y,vx,vy;
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=ix; y=iy;
color=icolor;
vx=rand()%17-8;
vy=rand()%17-8;
}
TPoint::~TPoint()
{
Hide();
}
void TPoint:Draw(int icolor)
{
GrPlot(x,y,icolor);
GrPlot(x,y+1,icolor);
GrPlot(x+1,y,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((rand()%100)==50)
{
vx=rand()%17-8;
vy=rand()%17-8;
}
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;
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,y,r,icolor);
}

#define M 10000
main()
{int N=10;

TPoint *obj[M];
GrSetMode(GR_width_height_graphics,1024,768);
srand(time(0));

int i;
int count;
i=0;
obj[i]=new TCircle(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),10 ,2);
for(i=1;i<N;i++){
count=rand()%3;
switch(count)
{case 1:
obj[i]=new TBox(rand()%(GrMaxX()+1),rand()%(GrMaxY()+1),15,ra nd()%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(30);
for(i=0;i<N;i++){
s=rand()%100;
if (s=50)
{ obj[i]->MoveXY(obj[i]->x+obj[i]->vx,obj[i]->y+obj[i]->vy);;}
}
for (i=1;i<N;i++){
obj[i]->vx=((obj[0]->x-obj[i]->x)/10+rand()%7-3);
obj[i]->vy=((obj[0]->y-obj[i]->y)/10+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,ra nd()%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>1){
delete obj[N-1];
N--;
}
break;
}

}while(key!=GrKey_Escape);
for(i=0;i<N;i++){
delete obj[i];
}
}
brokilone вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070