[pascal]Graph

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by r0, 25 Oct 2007.

  1. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Как реализовать точку, движущуюся в заданном прямоугольнике(rectangle(x1,y1,x2,y2) ), чтобы она отскакивала от краев?
    Начинает движение под углом A.
     
  2. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Что непонятно, алгоритм отражения? Угол падения равен углу отражения (они рядом лежат через перпендикуляр к отражающей поверхности)
     
  3. Sn@k3

    Sn@k3 Elder - Старейшина

    Joined:
    13 Apr 2006
    Messages:
    1,000
    Likes Received:
    438
    Reputations:
    90
    дворд он не про это, это он курсач пишет, сто пудов))) я по такой же теме в том году писал.
    чувак, у те должна быть методичка смори как реализовывать граф. а так те нужно к математикам обращаться, уравнение получить
     
  4. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    >>движущуюся в заданном прямоугольнике(rectangle(x1,y1,x2,y2) )
    при ударе об боковые стенки координата х меняется на противоположную, при ударе об нижнюю или верхнюю стенку y.

    >>дворд он не про это, это он курсач пишет, сто пудов))) я по такой же теме в том
    >>году писал. чувак, у те должна быть методичка смори как реализовывать граф. а так
    >>те нужно к математикам обращаться, уравнение получить

    а при чем тут графы?
     
    2 people like this.
  5. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Да, графы тут непричем. Название темы, как я понимаю, от слова "графика"
     
  6. ~Lexx~

    ~Lexx~ Elder - Старейшина

    Joined:
    30 Sep 2006
    Messages:
    195
    Likes Received:
    28
    Reputations:
    0
    ГЫ. Херасебе курсовые... у меня на первом курсе надо было написать язык прогграммирования, со сходными паскалю командами - тоесть полностью поддержка ООП, обращение к памяти... пришлось пас выучить досконально. На самом деле все действительно очень просто - выводишь уравнение движения(по х и по у), и потом выделяя целую часть из каждой координыты строишь точку. уравнения можно взять из линейной алгебры, если незнаешь как )))
     
  7. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Lexx, расскажи пожалуйста что у тебя за институт и факультет. Если стесняешься, можно в приватные сообщения.
     
  8. ~Lexx~

    ~Lexx~ Elder - Старейшина

    Joined:
    30 Sep 2006
    Messages:
    195
    Likes Received:
    28
    Reputations:
    0
    У меня Белорусский государственный университет, факультет радиофизики и электроники. Специальность компьютерная безопасность. Кстати если есть желание - где то на bsu.by можно скачать электронные конспекты почти по всем предметам - линейная алгебра - 1 курс Березкина Л.Л. там ооочень хорошо распиана вся линейка и аналитическая геометрия.
     
  9. DWORD

    DWORD Elder - Старейшина

    Joined:
    24 Jul 2007
    Messages:
    129
    Likes Received:
    70
    Reputations:
    -36
    Спасибо мне на самом деле было бы очень интересно почитать официальный сайт, если на нем размещены курсы учебных планов например и какие-то конспекты
     
  10. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Слово
    означает название модуля, позволяющего формировать изображения..
    Ну в идеале я ожидал хотя бы пару строк кода.. А тема ушла в обсуждение "какой я крутой, а ты лох".
    То что угол падения равен углу отражения это я и так знаю("от старшего брата"), пишу я не курсовую. Спасибо за напоминание.
    Спасибо за ответы.
     
  11. G1yuK

    G1yuK Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    41
    Likes Received:
    9
    Reputations:
    0
    угу с графом на первом курсе в своё время веселились(хотя задание веселое попалось, реализовать посадку спутника на планету, увеличивая уменьшая тягу), ну это поофтопил чутка...
    я раньше на с+ писал подобное, но доделланый код затерялся.
    С точкой сделать проще, чем с кругом.
    Как и написал ZaCo, меняешь x и y на противоположный.Например есть шаги dx и dy, вначале они равны по 1, при достигании максимому по например x2-1(так как точка будет иметь радиус=1), меняем dx=-1,это если по прямой летает, если под углом, то и соответствующий dy. Только в таком случае, фигурка летает под углом 45 градусов, а для разноообразного начала движения, использовал рандомное значения dx и dy (-1 или 1 для каждого)
     
    1 person likes this.
  12. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    G1yuK ответил наиболее правильно.

    Просто определяешь dx и dy
    dx:=sin(угол)*скорость;
    dy:=cos(угол)*скорость;

    а потом в цикле прибавляешь их к x и y
    x:=x+dx;
    y:=y+dy;
    if ((x<rect.left) or (x>rect.right)) then dx:=-dx;
    if ((y<rect.top) or (y>rect.bottom)) then dy:=-dy;

    и перерисовываешь точку

    That's it!
     
    1 person likes this.
  13. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Ну вот что-то написал, может кто-нибудь поможет дописать? Очень надо =(
    Code:
    uses crt,graph;
    var q,p,err,det,dm,x1,y1,x2,y2,i:integer;
    
    function point(c,d:integer):integer;
    begin
    
    putpixel(c,d,2);
    delay(10000);
    
    putpixel(c,d,0);
    end;
    
    function lie(c,d,e,f:integer):integer;
    begin
    for i:=c to d do
    begin
      delay(1000);
      setcolor(5);
      LineTo(i,d);
      delay(500);
      setcolor(15);
      LineTo(i+5,d);
    end;
    for i:=d to f do
    begin
      delay(1000);
      setcolor(5);
      LineTo(e,i);
      delay(500);
      setcolor(15);
      LineTo(e,i+5);
    end;
    
    for i:=e downto c do
    begin
      delay(1000);
      setcolor(5);
      LineTo(i,f);
      delay(500);
      setcolor(15);
      LineTo(i-5,f);
    end;
    for i:=f downto d do
    begin
      delay(1000);
      setcolor(5);
      LineTo(c,i);
      delay(500);
      setcolor(15);
      LineTo(c,i-5);
    end;
    
    
    end;
    
    
    begin
    det:=detect;
    initgraph(det,dm,'c:\coding\bp\bgi\');
    err:=graphresult;
    if err<>grOk then writeln(grapherrormsg(err));
    readln(x1,y1,x2,y2);
    rectangle(x1,y1,x2,y2);
    
    {вычисление приращений для отскока}  
    p:=x1;
    q:=y1;
    repeat
    p:=p+1;
    q:=q+2;
    point(p,q);
    if p>=x2 then
    p:=p-2;
    if q>=y2 then
    q:=q-4;
    
    lie(x1,y1,x2,y2);
    until keypressed;
    
    
    readkey;
    closegraph;
    end.
    
     
  14. G1yuK

    G1yuK Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    41
    Likes Received:
    9
    Reputations:
    0
    вот этот кусок кода
    Code:
    det:=detect;
    initgraph(det,dm,'c:\coding\bp\bgi\');
    err:=graphresult;
    if err<>grOk then writeln(grapherrormsg(err));
    
    помести после readln( у тебя включается графика, а в ней readln не работает и не может считать данные), а лучше все эти 4 координаты прямоугольника сделай константами. Легче потом в коде разбираться. Это пока явные ошибки.
    Ещё ты писал что точка начинает двигаться под углом А. Но у тебя нигде нет ввода угла А.
    Так же немного не ясно, зачем функция lie. Она вроде как рисует прямоугольник вручную?
     
    #14 G1yuK, 20 Dec 2007
    Last edited: 20 Dec 2007
    1 person likes this.
  15. Xserg

    Xserg Elder - Старейшина

    Joined:
    9 Dec 2006
    Messages:
    135
    Likes Received:
    127
    Reputations:
    53
    Для угла 45гр добавь две переменные vx,vy:integer;
    Code:
    
    {вычисление приращений для отскока}  
    p:=x1; vx:=+1;
    q:=y1; vy:=+1;
    repeat
    if ((p+vx)<x2) and ((p+vx)>x1) then p:=p+vx else if vx>0 then vx:=-1 else vx:=+1;
    if ((q+vy)<y2) and ((q+vy)>y1) then q:=q+vy else if vy>0 then vy:=-1 else vy:=+1;
    point(p,q);
    lie(x1,y1,x2,y2);
    until keypressed;
    
    Паскалей нет проверить не могу :(
     
    1 person likes this.
  16. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    У меня все работает, данные readln считывает.
    На угол мне уже пофик, лишбы двигалась точка, хотя, конечно, и угол не помешал бы.
    http://forum.antichat.ru/showpost.php?p=487880&postcount=61
    Xserg с п а с и б о!)
    Переделал вот так:

    Code:
    p:=x1; vx:=trunc(sin(a))+3;
    q:=y1; vy:=trunc(cos(a))+3;
    repeat
    if ((p+vx)<x2) and ((p+vx)>x1) then p:=p+vx else if vx>0 then vx:=-3 else vx:=+3;
    if ((q+vy)<y2) and ((q+vy)>y1) then q:=q+vy else if vy>0 then vy:=-3 else vy:=+3;
    point(p,q);
    lie(x1,y1,x2,y2);
    until keypressed;
    
    Хм.. теперь осталось вычислить соприкасается ли Удав и точка...
     
  17. r0

    r0 Elder - Старейшина

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Так, как я уже писал, остается вычислить соприкасается ли Удав и точка...
    Чтобы мне сравнить координаты точки(он же зайчек) и удава, мне нужно чтобы ф-я возвращала в программу параметры? Правильно я написал? Что-то нет у меня радостного сообщения на экране "congrats!"
    Code:
    uses crt,graph;
    var vx,vy,q,p,err,det,dm,x1,y1,x2,y2,i,a:integer;
    
    
    function point(k,l:integer):integer;
    begin
    
    putpixel(k,l,2);
    delay(9000);
    
    putpixel(k,l,0);
    end;
    
    [B]procedure lie(var c,d,e,f:integer);[/B]
    begin
    for i:=c to d do
    begin
      delay(1000);
      setcolor(5);
      LineTo(i,d);
      delay(500);
      setcolor(15);
      LineTo(i+5,d);
    end;
    for i:=d to f do
    begin
      delay(1000);
      setcolor(5);
      LineTo(e,i);
      delay(500);
      setcolor(15);
      LineTo(e,i+5);
    end;
    
    for i:=e downto c do
    begin
      delay(1000);
      setcolor(5);
      LineTo(i,f);
      delay(500);
      setcolor(15);
      LineTo(i-5,f);
    end;
    for i:=f downto d do
    begin
      delay(1000);
      setcolor(5);
      LineTo(c,i);
      delay(500);
      setcolor(15);
      LineTo(c,i-5);
    end;
    
    
    end;
    
    
    begin
    det:=detect;
    initgraph(det,dm,'e:\bp\bgi\');
    err:=graphresult;
    if err<>grOk then writeln(grapherrormsg(err));
    readln(x1,y1,x2,y2,a);
    rectangle(x1,y1,x2,y2);
    
    {вычисление приращений для отскока}
    
    p:=x1; vx:=round(sin(a)+3);
    q:=y1; vy:=round(cos(a)+3);
    repeat
    if ((p+vx)<=x2) and ((p+vx)>=x1) then p:=p+vx else if vx>=0 then vx:=-3 else vx:=+3;
    if ((q+vy)<=y2) and ((q+vy)>=y1) then q:=q+vy else if vy>=0 then vy:=-3 else vy:=+3;
    point(p,q);
    lie(x1,y1,x2,y2);
    [B]if ( (p=x1) or (p=x2) ) and ( (q=y1) or (q=y2) ) then[/B]
    begin
         setcolor(10);
         settextstyle(3,0,8);
         outtextxy(150,200,'CONGRATS! [B]Udav[/B] fucked the rabbit! ');
    
    end;
    until keypressed;
    
    
    readkey;
    closegraph;
    end.
    
     
    1 person likes this.
  18. G1yuK

    G1yuK Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    41
    Likes Received:
    9
    Reputations:
    0
    Code:
    if (k=1) then
    begin
         clrscr;
         setcolor(10);
         settextstyle(3,0,8);
         outtextxy(150,200,'CONGRATS! Udav fucked the rabbit! ');
         delay(1000);
    end;
    
    немного код переписать и поставить после слов until ((keypressed) or (k=1)) и в самом начале программы k:=0; . А на место того кода при выполнении условия k:=1; У тебя даже если зайчика поймали, он продолжит рисовать поверх надписи о победе.
    Так же тебе надо синхронизировать передвижение зайца и удава. А то у тебя удав делает полный круг и заяц делает ход. Может хотя бы разбить те 4 цикла на 4 функции. Передвижение по нижней планке ,левой правой, верхней. И вызывать по определённому условию
     
    #18 G1yuK, 22 Dec 2007
    Last edited: 22 Dec 2007