Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Мастер-Эксперт

946

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

512

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

353

Россия, Санкт-Петербург


ID: 137394

Megaloman

Мастер-Эксперт

311

Беларусь, Гомель


ID: 400669

epimkin

Профессионал

191


ID: 400484

solowey

Профессор

71


ID: 401888

puporev

Профессор

53

Россия, Пермский край


8.1.6

02.01.2021

JS: 2.2.2
CSS: 4.2.0
jQuery: 3.5.1


 

Создание программ на языках Pascal, Delphi и Lazarus.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)


Gluck
Статус: 6-й класс
Рейтинг: 286
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 269
puporev
Статус: Профессор
Рейтинг: 53
 

Перейти к консультации №:
 

Консультация онлайн # 199858
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: QWERUIO (Посетитель)
Дата: 13.12.2020, 08:03
Поступило ответов: 1

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В программе(код прикреплён) реализуется движение молекул. Вопрос: как случайным образом разделить молекулы на красные и синие(в класс добавить значение цвета и с помощью 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

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 199858

QWERUIO

Посетитель

ID: 404602

1

= общий = |  13.12.2020, 19:17 |  цитировать |  профиль |  личное сообщение

в класс TMolekula нужно ещё добавить значение цвета

Зенченко Константин Николаевич

Старший модератор

ID: 31795

2

= общий = |  14.12.2020, 12:32 |  цитировать |  профиль |  личное сообщение
QWERUIO:

Цитата: QWERUIO
в класс TMolekula нужно ещё добавить значение цвета

Зачем?
Ставите в класс TMolekula две булевые переменные absorber(поглощатель)=красный и show(показать). При создании молекулы Вы всем ставите параметр show:=истина, только красным absorber:=истина, остальным ложь.

show:
Если молекула поглощенная сбрасываете show:=ложь, все она больше нигде не участвует, не двигается и не отображается, также игнорируется при расчете дистанции. По большому счету саму молекулу нужно исключать из списка, но так как Вы все обрабатываете с циклах может нарушится индексация, а так
if Mol.show then
  begin
    . . .
  end;

И никаких заморочек.

absorber:
Есть такая команда XOR.
truetruefalse
truefalsetrue
falsetruetrue
falsefalsefalse

Из таблицы видно, что если у молекул разные значения, то простым условием
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;

И тоже без лишних заморочек.
smile

Последнее редактирование 14.12.2020, 12:34 Зенченко Константин Николаевич (Старший модератор)

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич

Старший модератор

ID: 31795

3

= общий = |  16.12.2020, 17:44 |  цитировать |  профиль |  личное сообщение
QWERUIO:

Получилось?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

QWERUIO

Посетитель

ID: 404602

4

= общий = |  19.12.2020, 04:40 |  цитировать |  профиль |  личное сообщение

Нет, не совсем понятно как написать в программе первые два кода. То есть что должно быть вместо этих точек и в какие процедуры эти if прописать? smile

Последнее редактирование 19.12.2020, 04:47 QWERUIO (Посетитель)

QWERUIO

Посетитель

ID: 404602

5

= общий = |  19.12.2020, 04:53 |  цитировать |  профиль |  личное сообщение

Цитата: QWERUIO


Объявлять так?
TMolekula=class //молекула
Fx, Fy, FVx, FVy, FR: integer;
absorder,show:boolean;

Зенченко Константин Николаевич

Старший модератор

ID: 31795

6

= общий = |  19.12.2020, 17:35 |  цитировать |  профиль |  личное сообщение
QWERUIO:

Цитата: QWERUIO
Объявлять так

Да.

Цитата: QWERUIO
в какие процедуры эти if прописать

Я дал Вам всю нужную информацию:
Цитата: Зенченко Константин Николаевич
Если молекула поглощенная сбрасываете show:=ложь, все она больше нигде не участвует, не двигается и не отображается, также игнорируется при расчете дистанции.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

QWERUIO

Посетитель

ID: 404602

7

 +1 
 
= общий = |  20.12.2020, 01:22 |  цитировать |  профиль |  личное сообщение

Спасибо, разобралась smile

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