Лидеры рейтинга
Мастер-Эксперт
946
Мастер-Эксперт
512
Академик
353
Мастер-Эксперт
311
Профессионал
191
Профессор
71
Профессор
53
8.1.6
02.01.2021
JS: 2.2.2
CSS: 4.2.0
jQuery: 3.5.1
Создание программ на языках Pascal, Delphi и Lazarus.
Администратор раздела: Зенченко Константин Николаевич (Старший модератор)
|
Перейти к консультации №: |
|
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В программе(код прикреплён) реализуется движение молекул. Вопрос: как случайным образом разделить молекулы на красные и синие(в класс добавить значение цвета и с помощью RGB бахнуть...), при этом одноцветные должны отталкиваться, а красные поглощают синих?
Приложение:
Состояние: Консультация закрыта
Здравствуйте, QWERUIO!
Вам нужно добавить в TMolekula два свойства Show и Absorber. Show отвечает за отображение на экране молекулы, Absorber - поглощение и цвет.
Изменить процедуры следующим образом:
procedure TForm1.Painting; var i:integer; Mol:TMolekula; begin paintBox1.Canvas.Brush.Color:=FonColor; paintBox1.Canvas.Rectangle(0,0,pbWidth,pbHeight); for i := 0 to MolList.Count-1 do begin Mol:=TMolekula(MolList.Items[i]); if Mol.Show then begin if Mol.absorber then paintBox1.Canvas.Brush.Color:=RedColor else paintBox1.Canvas.Brush.Color:=BlueColor; PaintBox1.Canvas.Ellipse(Mol.Fx-Rad, Mol.Fy-Rad, Mol.Fx+Rad, Mol.Fy+Rad); end; end; end; procedure TForm1.Timer1Timer(Sender: TObject); var x,y:integer; i:integer; Mol:TMolekula; begin for i := 0 to MolList.Count-1 do begin Mol:=TMolekula(MolList.Items[i]); if Mol.Show then begin Mol.Fx:=Mol.Fx+Mol.FVx; Mol.Fy:=Mol.Fy+Mol.FVy; Mol.Wall(i,pbwidth,pbheight); Mol.Strike(i); end; end; Painting; end; procedure TMolekula.Strike(i:integer); var j:byte; Mol1,Mol2:TMolekula; temp:integer; begin Mol1:=TMolekula(MolList.Items[i]); for j:= 0 to MolList.Count-1 do begin if j<>i then begin Mol2:=TMolekula(MolList.Items[j]); if Mol2.Show then if DistanceBetween(Mol1,Mol2)<=2*Rad then if Mol1.absorber xor Mol2.absorber then begin Mol1.Show:=Mol1.absorber; Mol2.Show:=Mol2.absorber; end else begin temp:=Mol1.FVx; Mol1.FVx:=Mol2.FVx; Mol2.FVx:=temp; temp:=Mol1.FVy; Mol1.FVy:=Mol2.FVy; Mol2.FVy:=temp; end; end; end; end;
|
Консультировал: Зенченко Константин Николаевич (Старший модератор) Дата отправки: 22.12.2020, 11:58 |
Рейтинг ответа:
0 Сообщение модераторам Отправлять сообщения |
Посетитель ID: 404602
0
|
в класс TMolekula нужно ещё добавить значение цвета | ||||||||||||
Зенченко Константин Николаевич
Старший модератор ID: 31795
0
|
QWERUIO: Цитата: QWERUIO в класс TMolekula нужно ещё добавить значение цвета Зачем? Ставите в класс TMolekula две булевые переменные absorber(поглощатель)=красный и show(показать). При создании молекулы Вы всем ставите параметр show:=истина, только красным absorber:=истина, остальным ложь. show: Если молекула поглощенная сбрасываете show:=ложь, все она больше нигде не участвует, не двигается и не отображается, также игнорируется при расчете дистанции. По большому счету саму молекулу нужно исключать из списка, но так как Вы все обрабатываете с циклах может нарушится индексация, а так Код :: выделить код if Mol.show then begin . . . end; И никаких заморочек. absorber: Есть такая команда XOR.
Из таблицы видно, что если у молекул разные значения, то простым условием Код :: выделить код if Mol1.adabsorber xor Mol2.absorber then begin . . .{поглощение} end else begin . . .{столкновение} end; И тоже никаких заморочек. И рисование тоже простое: Код :: выделить код procedure TForm1.Painting; var i:integer; Mol:TMolekula; begin paintBox1.Canvas.Brush.Color:=FonColor; paintBox1.Canvas.Rectangle(0,0,pbWidth,pbHeight); for i := 0 to MolList.Count-1 do begin Mol:=TMolekula(MolList.Items[i]); if Mol.absorber then paintBox1.Canvas.Brush.Color:=RedColor else paintBox1.Canvas.Brush.Color:=BlueColor; PaintBox1.Canvas.Ellipse(Mol.Fx-Rad, Mol.Fy-Rad, Mol.Fx+Rad, Mol.Fy+Rad); end; end; И тоже без лишних заморочек. ![]() Последнее редактирование 14.12.2020, 12:34 Зенченко Константин Николаевич (Старший модератор) ===== | ||||||||||||
Зенченко Константин Николаевич
Старший модератор ID: 31795
0
|
QWERUIO: Получилось? ===== | ||||||||||||
Посетитель ID: 404602
0
|
Нет, не совсем понятно как написать в программе первые два кода. То есть что должно быть вместо этих точек и в какие процедуры эти if прописать? Последнее редактирование 19.12.2020, 04:47 QWERUIO (Посетитель) | ||||||||||||
Посетитель ID: 404602
0
|
Цитата: QWERUIO Объявлять так? TMolekula=class //молекула Fx, Fy, FVx, FVy, FR: integer; absorder,show:boolean; | ||||||||||||
Зенченко Константин Николаевич
Старший модератор ID: 31795
0
|
QWERUIO: Цитата: QWERUIO Объявлять так Да. Цитата: QWERUIO в какие процедуры эти if прописать Я дал Вам всю нужную информацию: Цитата: Зенченко Константин Николаевич Если молекула поглощенная сбрасываете show:=ложь, все она больше нигде не участвует, не двигается и не отображается, также игнорируется при расчете дистанции. ===== | ||||||||||||
Посетитель ID: 404602
+1
|
Спасибо, разобралась |
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.