Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18

Несколько анимаций одновременно

31.05.2015, 15:34. Показов 2133. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
нужно реализовать несколько действий одновременно в паскаль абс нет, как это можно сделать?
у меня качающиеся маятники, все данные о которых хранятся в массиве записей. Получается только поочередно их качать
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2015, 15:34
Ответы с готовыми решениями:

Несколько циклов одновременно
Есть такая программа, кликаешь и идёт "анимация" капель. Можно ли сделать так, чтобы при нескольких кликах было столько же капель...

Как извлечь из строки несколько символов одновременно
Как извлечь из строки несколько символов одновременно?

Несколько шариков, летающих одновременно
Написал код для одного шарика uses crt,graph; {const x=630;y=470;} var q,i,j,gd,gm,r,xo,yo,m,k,n,x1o,y1o,k2:integer; ...

18
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
31.05.2015, 15:37
Показывай код, качающий маятники поочередно.
0
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
31.05.2015, 16:11  [ТС]
поочередно циклом for
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
for i:=1 to n do 
      begin
        with all[i] do
          begin            
            repeat
              while (u>=-pi/2-ugol) do
                begin
                  clearwindow;
                  u:=u-du;
                  cpx:=tpodvesa+round(dlina*cos(u));
                  cpy:=ytpodvesa-round(dlina*sin(u));
                  paint(all[i]);
                  Redraw;
                  sleep(100);
                end;
              while (u<=-pi/2+ugol)do 
                begin
                  clearwindow;
                  u:=u+du;
                  cpx:=tpodvesa+round(dlina*cos(u));
                  cpy:=ytpodvesa-round(dlina*sin(u));
                  paint(all[i]);
                  Redraw;
                  sleep(100);
                end;
            ugol:=ugol-pi/20;
          until (ugol<0);  
        end;    
    end;
Добавлено через 6 минут
где all - массив записей
каждая запись имеет вид
Pascal
1
2
3
4
5
6
7
8
9
tshar=record
            tpodvesa:integer;//координата x точки подвеса нити
            ytpodvesa:integer;//координата у точки подвеса
            dlina:integer;//длина нити
            radius:integer;//радиус шарика
            ugol:real;//угол наклона от вертикали            
            cpx:integer;//центр стыка
            cpy:integer//центр стыка
          end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
31.05.2015, 16:53
Ну и что, мне надо дотелепатировать, как именно что заполнялось? У меня есть более интересные занятия. Я просил код, а не его огрызки. Ну, нет - так нет, значит, помощь не нужна...
0
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
31.05.2015, 17:15  [ТС]
Нужна-нужна!
Ещё как нужна!
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Program kyrsovaya;
uses GraphABC;
type tshar=record
            tpodvesa:integer;//координата x точки подвеса нити
            ytpodvesa:integer;//координата у точки подвеса
            dlina:integer;//длина нити
            radius:integer;//радиус шарика
            ugol:real;//угол наклона от вертикали
            naprav:integer;//направление движения шарика (по или против часовой стрелки)
            cpx:integer;//центр стыка
            cpy:integer//центр стыка
          end;
     mas=array[1..50] of tshar;
var shar:tshar;
    all:mas;
    i,j:byte;
    n,x,y,z:integer;
    a,d,c,du,u:real;
Procedure paint(shar:tshar); //Рисуем маятник
   begin
    setpenwidth(2);    
    with shar do
    begin
      line(tpodvesa, 0, cpx, cpy);
      circle( cpx, cpy, radius);    
    end
  end;
Procedure vvod(var all:mas);
  var i:byte;
  begin
    Writeln('Введите количество шариков: ');
    Readln(n);
    for i:=1 to n do
      begin
        writeln('Введите координату точки подвеса: '); readln(shar.tpodvesa);
        writeln('Введите длину нити: '); readln(shar.dlina);
        writeln('Введите радиус шара: '); readln(shar.radius);
        writeln('Введите угол наклона: '); readln(shar.ugol);
        writeln('Введите направление движения (1 или -1): '); readln(shar.naprav);
        shar.ugol:= shar.ugol*pi/180;
        shar.ytpodvesa:=0;
        shar.cpx:=shar.tpodvesa;
        shar.cpy:=shar.ytpodvesa+shar.dlina;
        all[i]:=shar;
      end;
  ClearWindow; 
 end;
Procedure dvizenie(all:mas);
  var u,du:real;
      i:byte;
  begin
    u:=-pi/2;{начальное положение вертикально}
    du:=0.05;
    LockDrawing;
    for i:=1 to n do 
      begin
        with all[i] do
          begin            
            repeat
              while (u>=-pi/2-ugol) do
                begin
                  clearwindow;
                  u:=u-du;
                  cpx:=tpodvesa+round(dlina*cos(u));
                  cpy:=ytpodvesa-round(dlina*sin(u));
                  paint(all[i]);
                  Redraw;
                  sleep(100);
                end;
              while (u<=-pi/2+ugol)do 
                begin
                  clearwindow;
                  u:=u+du;
                  cpx:=tpodvesa+round(dlina*cos(u));
                  cpy:=ytpodvesa-round(dlina*sin(u));
                  paint(all[i]);
                  Redraw;
                  sleep(100);
                end;
            ugol:=ugol-pi/20;
          until (ugol<0);  
        end;    
    end;
  clearwindow;{установим в начальное положение}
  for i:=1 to n do paint(all[i]);
  end;
Begin
 SetWindowWidth(800);
 SetWindowHeight(600); 
 vvod(all);
 setpencolor(RGB(random(255),random(255),random(255)));
 setbrushcolor(RGB(random(255),random(255),random(255)));
 
 for i:=1 to n do dvizenie(all);
End.
Добавлено через 16 минут
volvo, вернитесь, пожалуйста
0
31.05.2015, 17:27

Не по теме:

Цитата Сообщение от приветушки Посмотреть сообщение
volvo, вернитесь, пожалуйста
Вернись, я все прощу...

0
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
31.05.2015, 17:57  [ТС]
Правда помощь очень-очень нужна. Давно над этим сижу, мыслей больше никаких нет
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
31.05.2015, 18:01
Ну, и чего это за набор инструкций? Что вводить-то, чтоб хоть как-то запустить и посмотреть? Ввел "2 шарика", тут же вылет на 35 строке кода. Дальше что делать?
0
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
31.05.2015, 18:15  [ТС]
там просто числа вводить
например
число шариков (просто число)
2
координата точки подвеса (от 1 до 800)
направление (1 или -1), однако пока это поле еще не пригодится

длина нити (от 1 до 600)
радиус (число)
угол наклона (в градусах от 1 до 90, например, 60)

Добавлено через 5 минут
например, вот тест

количество шариков
2
координаты точки подвеса
200
длина нити
150
радиус шара
40
угол
60
направление
1

координаты точки подвеса
600
длина нити
250
радиус шара
60
угол
50
направление
1

Только что отработала у меня
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
31.05.2015, 18:43
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

приветушки, я бы посмотрел в сторону "один маятник - один поток". Как-то вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
program kyrsovaya;
 
uses
  GraphABC, System.Threading;
 
type
  tshar = record
    tpodvesa: integer;//координата x точки подвеса нити
    ytpodvesa: integer;//координата у точки подвеса
    dlina: integer;//длина нити
    radius: integer;//радиус шарика
    ugol: real;//угол наклона от вертикали
    naprav: integer;//направление движения шарика (по или против часовой стрелки)
    cpx: integer;//центр стыка
    cpy: integer//центр стыка
  end;
  mas = array[1..50] of tshar;
 
var
  shar: tshar;
  all: mas;
  i, j: byte;
  n, x, y, z: integer;
  a, d, c, du, u: real;
 
procedure paint(shar: tshar);//Рисуем маятник
begin
  setpenwidth(2);    
  with shar do
  begin
    line(tpodvesa, 0, cpx, cpy);
    circle( cpx, cpy, radius);    
  end
end;
 
procedure vvod(var all: mas);
var
  i: byte;
begin
  Writeln('Введите количество шариков: ');
  Readln(n);
    // shar := new tshar;
  for i := 1 to n do
  begin
    writeln('Введите координату точки подвеса: '); readln(shar.tpodvesa);
    writeln('Введите длину нити: '); readln(shar.dlina);
    writeln('Введите радиус шара: '); readln(shar.radius);
    writeln('Введите угол наклона: '); readln(shar.ugol);
    writeln('Введите направление движения (1 или -1): '); readln(shar.naprav);
    shar.ugol := shar.ugol * pi / 180;
    shar.ytpodvesa := 0;
    shar.cpx := shar.tpodvesa;
    shar.cpy := shar.ytpodvesa + shar.dlina;
    all[i] := shar;
  end;
  ClearWindow; 
end;
 
procedure dvizenie(m: System.object);
var
  u, du: real;
  i: byte;
  shar: tshar;
begin
  shar := tshar(m);
  u := -pi / 2;{начальное положение вертикально}
  du := 0.05;
    ;
    //for i:=1 to n do 
    //  begin
    //    with all[i] do
    //      begin 
  with shar do
    repeat
      while (u >= -pi / 2 - ugol) do
      begin
        clearwindow;
        u := u - du;
        cpx := tpodvesa + round(dlina * cos(u));
        cpy := ytpodvesa - round(dlina * sin(u));
        paint(shar);
                  // paint(all[i]);
                  // Redraw;
        sleep(100);
      end;
      while (u <= -pi / 2 + ugol) do 
      begin
        clearwindow;
        u := u + du;
        cpx := tpodvesa + round(dlina * cos(u));
        cpy := ytpodvesa - round(dlina * sin(u));
        paint(shar);
                  // paint(all[i]);
                  // Redraw;
        sleep(100);
      end;
      ugol := ugol - pi / 20;
    until (ugol < 0);  
  //    end;    
  //end;
  // clearwindow;{установим в начальное положение}
  // for i:=1 to n do paint(all[i]);
end;
 
begin
  SetWindowWidth(800);
  SetWindowHeight(600); 
  vvod(all);
  setpencolor(RGB(random(255), random(255), random(255)));
  setbrushcolor(RGB(random(255), random(255), random(255)));
  // LockDrawing;
  
  var th: array of Thread := new Thread[n];
  for var ith := 0 to pred(n) do
  begin
    th[ith] := new Thread(dvizenie);
    th[ith].Start(all[ith + 1]);
  end;
  // for i:=1 to n do dvizenie(all);
end.
, но надо дорабатывать, ибо мерцает (я не знаю, умеет ли LockDrawing работать в многопоточном приложении, сегодня-завтра попробую кое-что, потом расскажу, получилось или нет)
1
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
31.05.2015, 18:53  [ТС]
Здорово, они качаются вдвоём
правда мы еще с объектами не знакомы, видимо предполагается, что можно обойтись без них.
Спасибо огромное, постараюсь освоить объекты)
Своих идей у меня просто никаких, вы - мой спаситель)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
31.05.2015, 22:09
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

приветушки, А вот это - без потоков:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
program kyrsovaya;
 
uses
  GraphABC, System.Threading;
 
type
  tshar = record
    tpodvesa: integer;//координата x точки подвеса нити
    ytpodvesa: integer;//координата у точки подвеса
    dlina: integer;//длина нити
    radius: integer;//радиус шарика
    ugol: real;//угол наклона от вертикали
    naprav: integer;//направление движения шарика (по или против часовой стрелки)
    cpx: integer;//центр стыка
    cpy: integer;//центр стыка
    
    u: real;
    direction: integer;
  end;
  mas = array[1..50] of tshar;
 
var
  shar: tshar;
  all: mas;
  n: integer; 
 
procedure paint(shar: tshar);//Рисуем маятник
begin
  setpenwidth(2);    
  with shar do
  begin
    line(tpodvesa, 0, cpx, cpy);
    circle( cpx, cpy, radius);    
  end
end;
 
procedure vvod(var all: mas);
var
  i: byte;
begin
  Writeln('Введите количество шариков: ');
  Readln(n);
  for i := 1 to n do
  begin
    writeln('Введите координату точки подвеса: '); readln(shar.tpodvesa);
    writeln('Введите длину нити: '); readln(shar.dlina);
    writeln('Введите радиус шара: '); readln(shar.radius);
    writeln('Введите угол наклона: '); readln(shar.ugol);
    writeln('Введите направление движения (1 или -1): '); readln(shar.naprav);
    shar.ugol := shar.ugol * pi / 180;
    shar.ytpodvesa := 0;
    shar.cpx := shar.tpodvesa;
    shar.cpy := shar.ytpodvesa + shar.dlina;
    
    shar.u := -pi / 2;
    shar.direction := -1;
    
    all[i] := shar;
  end;
  ClearWindow; 
end;
 
procedure repaintall;
var
  i: integer;
begin
  clearwindow;
  for i := 1 to n do paint(all[i]);
  redraw;
end;
 
function dvizenie(i: integer): integer;
var
  du: real;
begin
  du := 0.05;
  with all[i] do
  begin
    u := u + direction * du;
    cpx := tpodvesa + round(dlina * cos(u));
    cpy := ytpodvesa - round(dlina * sin(u));
    
    
    if (u < -pi / 2 + direction * ugol) = (direction = -1) then 
    begin
      direction := -direction;
      if direction = -1 then ugol := ugol - pi / 20; 
    end;
    
    result := ord(ugol <= 0);
  end;
  
end;
 
var
  bExit: boolean := false;
 
procedure MyPress(ch: integer);
begin
  bExit := (ch = VK_Escape);
end;
 
var
  i: integer;
  count: integer;
 
begin
  SetWindowWidth(800);
  SetWindowHeight(600); 
  vvod(all);
  setpencolor(RGB(random(255), random(255), random(255)));
  setbrushcolor(RGB(random(255), random(255), random(255)));
  
  OnKeyDown := MyPress;
  LockDrawing;
  repeat
    count := 0;
    for i := 1 to n do inc(count, dvizenie(i));
    repaintall;
    sleep(100);
  until (count = n) or bExit;
end.
1
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
31.05.2015, 22:45  [ТС]
О боже! работает!!
огромное-огромное спасибо!!
Безмерно благодарна!!!

Добавлено через 22 минуты
А теперь я в край обнаглела, но можно пожалуйста комментарии добавить? Не все понимаю(
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
01.06.2015, 01:46
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Как-то вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
program kyrsovaya;
 
uses
  GraphABC, System.Threading;
 
type
  tshar = record
    tpodvesa: integer;//координата x точки подвеса нити
    ytpodvesa: integer;//координата у точки подвеса
    dlina: integer;//длина нити
    radius: integer;//радиус шарика
    ugol: real;//угол наклона от вертикали
    naprav: integer;//направление движения шарика (по или против часовой стрелки)
    cpx: integer;//центр стыка
    cpy: integer;//центр стыка
    
    u: real;
    direction: integer;
  end;
  mas = array[1..50] of tshar;
 
var
  shar: tshar;
  all: mas;
  n: integer; 
 
procedure paint(shar: tshar);//Рисуем маятник
begin
  setpenwidth(2);    
  with shar do
  begin
    line(tpodvesa, 0, cpx, cpy);
    circle( cpx, cpy, radius);    
  end
end;
 
procedure vvod(var all: mas);
var
  i: byte;
begin
  Writeln('Введите количество шариков: ');
  Readln(n);
  for i := 1 to n do
  begin
    writeln('Введите координату точки подвеса: '); readln(shar.tpodvesa);
    writeln('Введите длину нити: '); readln(shar.dlina);
    writeln('Введите радиус шара: '); readln(shar.radius);
    writeln('Введите угол наклона: '); readln(shar.ugol);
    writeln('Введите направление движения (1 или -1): '); readln(shar.naprav);
    shar.ugol := shar.ugol * pi / 180;
    shar.ytpodvesa := 0;
    shar.cpx := shar.tpodvesa;
    shar.cpy := shar.ytpodvesa + shar.dlina;
    
    shar.u := -pi / 2;
    shar.direction := -1;
    
    all[i] := shar;
  end;
  ClearWindow; 
end;
 
procedure repaintall; // перерисовываем все маятники
var
  i: integer;
begin
  clearwindow;
  for i := 1 to n do paint(all[i]);
  redraw;
end;
 
// разбиваем движение маятника на части. За один раз - смещение на DU
function dvizenie(i: integer): integer;
var
  du: real;
begin
  du := 0.05;
  with all[i] do
  begin
    u := u + direction * du; // смещаем маятник в оду из сторон (в зависимости от знака direction)
    cpx := tpodvesa + round(dlina * cos(u)); // вычисляем новые координаты
    cpy := ytpodvesa - round(dlina * sin(u));
    
    
    if (u < -pi / 2 + direction * ugol) = (direction = -1) then // если маятник достиг крайней точки
    begin
      direction := -direction; // меняем направление движения
      
      // если направление опять вернулось к первоначальному - уменьшаем угол отклонения
      // (затухание, насколько я понимаю)
      if direction = -1 then ugol := ugol - pi / 20;
    end;
    
    result := ord(ugol <= 0); // вернуть 1, если маятник остановился, иначе 0
  end;
  
end;
 
var
  bExit: boolean := false; // основной цикл прервется, как только эта переменная станет true
 
procedure MyPress(ch: integer);
begin
  bExit := (ch = VK_Escape); // нажата кнопка Esc?
end;
 
var
  i: integer;
  count: integer;
 
begin
  SetWindowWidth(800);
  SetWindowHeight(600); 
  vvod(all);
  setpencolor(RGB(random(255), random(255), random(255)));
  setbrushcolor(RGB(random(255), random(255), random(255)));
  
  OnKeyDown := MyPress; // обрабатываем нажатие кнопок (ждем возможного нажатия Esc)
  LockDrawing;
  repeat
    count := 0; // количество остановившихся маятников будет здесь
    
    // делаем один шаг для каждого маятника, попутно подсчитывая, сколько из них остановилось
    for i := 1 to n do inc(count, dvizenie(i));
    // и перерисовываем всю картинку (все маятники)
    repaintall;
    sleep(100); // небольшая пауза
  until (count = n) or bExit; // пока не нажмем Esc,или все маятники не остановятся
end.
1
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
02.06.2015, 11:16  [ТС]
Спасибо огромное!

Добавлено через 15 часов 16 минут
volvo, теперь проблема с отскакиванием друг от друга
условие удара описано ниже
это кусочек только для шариков левее текущего (all[i])
когда прохожу пошагово, программа не переходит по ветке then
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
with all[i] do
  begin
      for j:=1 to i-1 do
      begin
        if ((all[j].cpx+all[j].radius) >= (cpx + radius)) {Условие для координаты x} and 
        ( ((all[j].cpy+all[j].radius) in [(cpy - radius)..( cpy + radius)]) // Если самая нижняя часть одного шара входит в координаты диаметра другого
            or ((all[j].cpy-all[j].radius) in [(cpy - radius)..(cpy + radius)]) // Если самая верхняя часть одного шара входит в координаты диаметра другого
            or ((cpy + radius) in [(all[j].cpy-all[j].radius)..(all[j].cpy+all[j].radius)]) // и наоборот
            or ((cpy - radius) in [(all[j].cpy-all[j].radius)..(all[j].cpy+all[j].radius)]) )            
          then 
            begin
              if direction <> all[j].direction then
                begin
                  direction := -direction;
                  all[j].direction := -all[j].direction;
                end;
            end;
      end;
Добавлено через 12 часов 40 минут
Не вижу ошибки в условии столкновения..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
02.06.2015, 11:27
Условие можно записать гораздо проще: найти расстояние между центрами шариков (теорема Пифагора, угу), и проверить, не меньше ли оно, чем сумма их радиусов. А не наворачивать трехэтажные конструкции
1
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
02.06.2015, 16:13  [ТС]
volvo, вот так сейчас выглядит вся процедура, но по ветке then он все равно идти не хочет

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function dvizenie(i: integer): integer;
var
  du: real;
  j: byte;
begin
  du := 0.05;
  with all[i] do
  begin
      for j:=1 to n do
        begin
          if (i <> j) and (sqrt(sqr(all[j].cpx + cpx) + sqr(all[j].cpy + cpy)) <= (all[j].radius + radius)) 
            then 
              begin                
                      direction := -direction;
                      all[j].direction := -all[j].direction;                   
              end;
         end;
      
        u := u + direction * du; // смещаем маятник в оду из сторон (в зависимости от знака direction)
        cpx := tpodvesa + round(dlina * cos(u)); // вычисляем новые координаты
        cpy := ytpodvesa - round(dlina * sin(u));    
  
        if (u < -pi / 2 + direction * ugol) = (direction = -1) then // если маятник достиг крайней точки
          begin
            direction := -direction; // меняем направление движения      
            // если направление опять вернулось к первоначальному - уменьшаем угол отклонения
            if direction = -1 then ugol := ugol - pi / 20;
          end;    
        result := ord(ugol <= 0); // вернуть 1, если маятник остановился, иначе 0
      end;  
  end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
02.06.2015, 16:42
приветушки, математику вспоминаем:
Pascal
1
if (i <> j) and (sqrt(sqr(all[j].cpx - cpx) + sqr(all[j].cpy - cpy)) <= (all[j].radius + radius))
На знаки обрати внимание. Сумма квадратов разностей все-таки...
1
 Аватар для приветушки
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 18
02.06.2015, 17:11  [ТС]
volvo, тьфу, ё моё! Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2015, 17:11
Помогаю со студенческими работами здесь

Несколько видов анимаций для одного контроллера
Честно говоря, перерыл уже весь яндекс и гугл (возможно плохо рыл). Игра 2Д. У меня есть 1 объект (NPC) и есть схема анимационных...

Power point несколько анимаций для одного слайда
Доброго времени суток. Имеется презентация, каждый слайд которой имеет анимацию типа &quot;Сдвиг &lt;туда-то&gt;&quot;. Вопрос в...

При наведении курсором на слайдер остановить сразу несколько анимаций
Здравствуйте! Есть 4 картинки в слайдере, каждая затухает и появляется поочередно. С этим я справился. Возник следующий вопрос: при...

Выполнение одновременно несколько sql запросов одновременно
Здравствуйте. Есть проблема! Пролистал много сайтов и форумов и толком ничего не нашел. Суть проблемы указана в заголовке но все равно...

Несколько прослушивателей одновременно
Добрый день, начал знакомится с программированием и встал такой вопрос. Возможет существовать несколько прослушивателей одновременно?...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru