Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2009, 04:37   #1
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию Pascal Движение в графике

Задание:
Нужно отрисовать крест и чтобы в нём двигался шарик (радиус шарика нужно спросит у пользователя) абсолютно хаотично.


Крест я нарисовал, но вот алгоритм движения шарика не могу придумать, помогите написать программу, контрольная лаба для зачёта!

Код:
uses graph,crt;
var
 graphdriver,
 graphmode:integer;
 ErrorCode:integer;

procedure MyGraphInit;
begin
 GraphDriver:=Detect;
 InitGraph(GraphDriver,GraphMode, '');
 ErrorCode:=GraphResult;
 if ErrorCode <> grOk then
 begin
  writeln('InitGraph Error: ',GraphErrorMsg(ErrorCode));
  Writeln('Program is aborted!');
  Halt(1);
 end;
end;

begin
 clrscr;
 MyGraphInit;
{--------Отрисова креста----------}
 line(220,70,300,70);
 line(220,70,220,150);
 line(220,150,140,150);
 line(140,220,140,150);
 line(220,220,140,220);
 line(220,220,220,300);
 line(220,300,300,300);
 line(300,300,300,220);
 line(300,220,380,220);
 line(380,220,380,150);
 line(380,150,300,150);
 line(300,150,300,70);
readln;
end.
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"
bpystep вне форума Ответить с цитированием
Старый 03.06.2009, 10:12   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

у Вас слишком мало сделано, чтобы Вам можно было просто подсказать... а делать полностью - нет времени. ;(
попробуйте посмотреть тут неоднократно были темы - зайдите в Поиск и задайте ключевое слово столкновения
посмотрите примеры реализации движения шариков...
вставьте в свою программу.

p.s. в вашем случае столкновения можно отслеживать:
либо считывать пиксели на пути движения шарика, если там есть белый цвет (встретили границу "креста") - изменяйте направление движения.

либо завести матрицу с координатами креста и передвигать в ней шарик.

либо (самый неуниверсальный способ) просто просто написать несколько проверок на совпадение координат шарика с границами креста...

либо.. <тут ещё другие варианты>
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.06.2009, 14:10   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
либо считывать пиксели на пути движения шарика
Плохая идея. Пиксели могут перерисовываться...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2009, 14:20   #4
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
Радость

Вот кусок моего кода из проекта на C++, может что-то интересное найдете...
Код:
void bot_tupoy::move()
{
   if((fabs(x-gamePoints[targetPointNumber].x*32)<=5)&&(fabs(y-gamePoints[targetPointNumber].y*32)<=5))
   {
		if (targetPointNumber==(gamePoints.size()-2))
		  targetPointNumber=0;
		else
		  targetPointNumber+=1;
   }
   radius=Sqrt(pow((x-gamePoints[targetPointNumber].x*32),2)+pow((y-gamePoints[targetPointNumber].y*32),2));

   if (((x-gamePoints[targetPointNumber].x*32)!=0)&&(radius!=0))
   {
	 angle= (x-gamePoints[targetPointNumber].x*32)/radius;
	 if(angle>1){angle=1;};  if(angle<-1){angle=-1;};
	 angle= acos(angle)*180/3.14+90;
	 if ((y-gamePoints[targetPointNumber].y*32)<0)
	 {
       angle=180-angle;
	 }
   }
   x+=cos((angle-90)*3.14/180)*-speed;
   y+=sin((angle-90)*3.14/180)*-speed;
}
gamePoints -массив "опорных точек", куда следует двигаться.
Вот как это выглядит(кнопочку не нажимать)))
// Не смотрите на корявость кода)))
Вложения
Тип файла: rar Project1.rar (17.7 Кб, 11 просмотров)

Последний раз редактировалось Levsha100; 03.06.2009 в 14:23.
Levsha100 вне форума Ответить с цитированием
Старый 05.06.2009, 03:06   #5
bpystep
Форумчанин
 
Регистрация: 25.02.2009
Сообщений: 180
По умолчанию

Код:
uses graph,crt;
var
 graphdriver,
 graphmode:integer;
 ErrorCode:integer;
 x,y,x1,y1,c1,c2,N:integer;
 r,i:integer;

Procedure Delay(x:longint);
var t:longint;
begin
t := MemL[Seg0040:$6c];
while MemL[Seg0040:$6c] < t+x do; {задержка на X тиков}
end;

procedure MyGraphInit;
begin
 GraphDriver:=Detect;
 InitGraph(GraphDriver,GraphMode, '');
 ErrorCode:=GraphResult;
 if ErrorCode <> grOk then
 begin
  writeln('InitGraph Error: ',GraphErrorMsg(ErrorCode));
  Writeln('Program is aborted!');
  Halt(1);
 end;
end;

begin
  N:=250;
 clrscr;
 MyGraphInit;
{--------Вывод креста----------}
 line(220,70,300,70);
 line(220,70,220,150);
 line(220,150,140,150);
 line(140,220,140,150);
 line(220,220,140,220);
 line(220,220,220,300);
 line(220,300,300,300);
 line(300,300,300,220);
 line(300,220,380,220);
 line(380,220,380,150);
 line(380,150,300,150);
 line(300,150,300,70);
 readln;
  x:=260;
  y:=185;
  c1:=0;c2:=12;
  for i:=1 to N do begin
  if ((x>150)and(x<390)and(y>170)and(y<230))
or ((x>230)and(x<310)and(y>80)and(y<310)) Then
  begin
    x1:=x;
    y1:=y;
    x:=x+random(8)-4;
    y:=y+random(8)-4;
   {круг}
   Setcolor(c1);{тоже, но черным(стираем)}
   Circle(x1,y1,10);
   Setfillstyle(1,c1);
   Fillellipse(x1,y1,10,10);
   Setcolor(c2);{цвет красный}
   Circle(x,y,10);{граница круга}
   Setfillstyle(1,c2);{сплошная закраска красным}
   Fillellipse(x,y,10,10);
    Delay(1);
    inc(i);
    end;
end;
  readln;
end.
Народ я дописал вот до такого состояния, может поможите с рандомам???
Запомните, вы едете в Россию, поэтому когда компьютер попросит вас набрать пароль, наберите слово "Пароль"

Последний раз редактировалось bpystep; 05.06.2009 в 04:05.
bpystep вне форума Ответить с цитированием
Старый 05.06.2009, 06:08   #6
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Код:
uses graph,crt;

const iter = 30;
      dly = 55;

var
 graphdriver,
 graphmode:integer;
 ErrorCode:integer;
 x,y,x1,y1,c1,c2:integer;
 xr,yr,xr2,yr2,vxr,vyr:real; {vxr, vyr -- пикселей в секунду}
 r,i:integer;
 wascollis:boolean;

procedure MyGraphInit;
begin
 GraphDriver:=Detect;
 InitGraph(GraphDriver,GraphMode, 'X:\BP');
 ErrorCode:=GraphResult;
 if ErrorCode <> grOk then
 begin
  writeln('InitGraph Error: ',GraphErrorMsg(ErrorCode));
  Writeln('Program is aborted!');
  Halt(1);
 end;
end;

procedure dotreflect(dotx,doty:real);
var
  paral, orth, moveback : real;
  movedbackx, movedbacky : real;
  newvxr, newvyr : real;
  push : real;
begin
  paral := ((xr2 - dotx) * vxr + (yr2 - doty) * vyr) / sqrt(sqr(vxr) + sqr(vyr));
  orth := ((xr2 - dotx) * vyr - (yr2 - doty) * vxr) / sqrt(sqr(vxr) + sqr(vyr));
  moveback := paral + sqrt(sqr(r + 1) - sqr(orth));
    { дистанция, на которую надо отодвинуть назад, чтобы восстановить
      момент столкновения }

  movedbackx := xr2 - moveback * vxr / sqrt(sqr(vxr) + sqr(vyr));
  movedbacky := yr2 - moveback * vyr / sqrt(sqr(vxr) + sqr(vyr));

  push := (vxr * (movedbackx - dotx) + vyr * (movedbacky - doty)) /
          (sqr(movedbackx - dotx) + sqr(movedbacky - doty));

  newvxr := vxr - 2 * push * (movedbackx - dotx);
  newvyr := vyr - 2 * push * (movedbacky - doty);

  vxr := newvxr;
  vyr := newvyr;

  xr2 := movedbackx + moveback * vxr / sqrt(sqr(vxr) + sqr(vyr));
  yr2 := movedbacky + moveback * vyr / sqrt(sqr(vxr) + sqr(vyr));

end;

begin
 clrscr;
 MyGraphInit;
{--------Вывод креста----------}
 line(220,70,300,70);
 line(220,70,220,150);
 line(220,150,140,150);
 line(140,220,140,150);
 line(220,220,140,220);
 line(220,220,220,300);
 line(220,300,300,300);
 line(300,300,300,220);
 line(300,220,380,220);
 line(380,220,380,150);
 line(380,150,300,150);
 line(300,150,300,70);
 readln;
  x:=260; xr:=x;
  y:=185; yr:=y;
  vxr:=130; vyr:=150;
  r:=16;
  c1:=0;c2:=12;
  while not KeyPressed do
  begin
    x1:=x;
    y1:=y;

    for i := 1 to iter do
    begin
      xr2 := xr + vxr * dly / iter / 1000;
      yr2 := yr + vyr * dly / iter / 1000;

      repeat
        wascollis := false;
        if xr2 - r <= 141.0 then
        begin
          xr2 := 2 * (141.0 + r) - xr2;
          vxr := abs(vxr);
          wascollis := true;
        end;
        if xr2 + r >= 379.0 then
        begin
          xr2 := 2 * (379.0 - r) - xr2;
          vxr := -abs(vxr);
          wascollis := true;
        end;

        if yr2 - r <= 71.0 then
        begin
          yr2 := 2 * (71.0 + r) - yr2;
          vyr := abs(vyr);
          wascollis := true;
        end;
        if yr2 + r >= 299.0 then
        begin
          yr2 := 2 * (299.0 - r) - yr2;
          vyr := -abs(vyr);
          wascollis := true;
        end;

        if sqr(xr2 - 220.0) + sqr(yr2 - 150.0) < sqr(r + 1) then
        begin
          dotreflect(220.0, 150.0);
          wascollis := true;
        end;
        if sqr(xr2 - 220.0) + sqr(yr2 - 220.0) < sqr(r + 1) then
        begin
          dotreflect(220.0, 220.0);
          wascollis := true;
        end;
        if sqr(xr2 - 300.0) + sqr(yr2 - 150.0) < sqr(r + 1) then
        begin
          dotreflect(300.0, 150.0);
          wascollis := true;
        end;
        if sqr(xr2 - 300.0) + sqr(yr2 - 220.0) < sqr(r + 1) then
        begin
          dotreflect(300.0, 220.0);
          wascollis := true;
        end;


        if ((yr2 >= 70.0) and (yr2 <= 150.0)) or
           ((yr2 >= 220.0) and (yr2 <= 300.0)) then
        begin
          if (xr2 - r <= 221.0) then
          begin
            xr2 := 2 * (221.0 + r) - xr2;
            vxr := abs(vxr);
            wascollis := true;
          end;

          if xr2 + r >= 299.0 then
          begin
            xr2 := 2 * (299.0 - r) - xr2;
            vxr := -abs(vxr);
            wascollis := true;
          end;
        end;

        if ((xr2 >= 140.0) and (xr2 <= 220.0)) or
           ((xr2 >= 300.0) and (xr2 <= 380.0)) then
        begin
          if yr2 - r <= 151.0 then
          begin
            yr2 := 2 * (151.0 + r) - yr2;
            vyr := abs(vyr);
            wascollis := true;
          end;
          if yr2 + r >= 219.0 then
          begin
            yr2 := 2 * (219.0 - r) - yr2;
            vyr := -abs(vyr);
            wascollis := true;
          end;
        end;

      until keypressed or not wascollis;
      xr := xr2;
      yr := yr2;

    end;

    {x:=x+random(8)-4;
    y:=y+random(8)-4;}

    x := round(xr);
    y := round(yr);
   {круг}
   Setcolor(c1);{тоже, но черным(стираем)}
   Circle(x1,y1,r);
   Setfillstyle(1,c1);
   Fillellipse(x1,y1,r,r);
   Setcolor(c2);{цвет красный}
   Circle(x,y,r);{граница круга}
   Setfillstyle(1,c2);{сплошная закраска красным}
   Fillellipse(x,y,r,r);
   Delay(dly);
  end;
  readln;
  CloseGraph;
end.
UPD: «Абсолютно хаотично» не заметил
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/

Последний раз редактировалось OCTAGRAM; 05.06.2009 в 13:40.
OCTAGRAM вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение точки с векторами.Pascal. Regboll Паскаль, Turbo Pascal, PascalABC.NET 0 21.05.2009 20:14
Выделение в графике Сб и Вс. Oleg21 Microsoft Office Excel 4 30.03.2009 04:41
Вопрос по Графике. BlackvsEvgen Помощь студентам 13 21.01.2009 16:22
Задачки по графике LaDy MaRMeLaD Паскаль, Turbo Pascal, PascalABC.NET 4 12.01.2008 16:14
Помогите сделать движение объектов в Pascal Ivanich Помощь студентам 44 11.12.2007 20:33