• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

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

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Использование циклов при построении изображения

Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Сообщения
1,151
Симпатии
222
Баллы
155
VK
Среда программирования:
Delphi
Построение повторяющихся элементов изображения имеет смысл включать в операторы цикла. Операторы цикла условно можно разделить на циклы по условию и циклы по количеству повторений (циклы-счетчики).

Когда точно известно количество повторяющихся элементов изображения удобно использовать цикл for.
Код:
for счетчик:=значение to конечное_значение do
     тело_цикла;
for счетчик:=значение downto конечное_значение do
     тело_цикла;
При переходе к обработке оператора цикла for управляющей переменной счетчикприсваивается заданное начальное значение. Затем в цикле выполняется исполнительный оператор (или составной оператор begin..end). Каждый раз при выполнении исполнительного оператора управляющая переменная увеличивается на 1 (для for...to) или уменьшается на 1 (для for...downto). Цикл завершается при достижении управляющей переменной своего конечного значения.

Пример использования оператора цикла for при построении забора из 20 элементов.
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var maxX, maxY : Integer;
    i : Integer;
begin
  maxX := PaintBox1.Width;
  maxY := PaintBox1.Height;
  // Количество повторений
  for i := 1 to 20 do  begin
    // Определение цвета досок забора
    PaintBox1.Canvas.Brush.Color := RGBToColor(200,160,0);
    // Отрисовка досок забора
    PaintBox1.Canvas.Rectangle(i*20, maxY, 19 + i*20, maxY-80);
    // Верхняя шапка забора
    PaintBox1.Canvas.Polygon([Point(i*20, maxY-80),
                              Point(10 + i*20, maxY-95), Point(19 + i*20, maxY-80)]);
    // Круглые отверстия в шапке
    PaintBox1.Canvas.Brush.Color := clWhite;
    PaintBox1.Canvas.Ellipse(7 + i*20, maxY-82, 13 + i*20, maxY-88);
  end;
  // Поперечные перекладины
  PaintBox1.Canvas.Brush.Color := RGBToColor(200,200,0);
  PaintBox1.Canvas.Rectangle(0, maxY-20, 620, maxY-25);
  PaintBox1.Canvas.Rectangle(0, maxY-55, 620, maxY-60);
end;

Если количество элементов не известно, то можно воспользоваться циклом по условию. Например, строить элементы изображения пока не будет достигнут край экрана (или поля для рисования). Различают циклы с предусловием и с постусловием. Цикл с предусловием
Код:
while expression do statement;
При выполнении этого оператора вначале вычисляется значение логического выражения expression. Если это значение истинно, выполняется оператор statement, затем значение выражения проверяется вновь и т. д., до тех пор, пока выражение не примет значение «ложь». Если выражение принимает значение «ложь» при первой же проверке, то оператор statement не выполняется вообще.

Пример использования оператора цикла while при построении морских волн.
Код:
procedure TForm1.Button1Click(Sender: TObject);
Var maxX, maxY : Integer;
    x : Integer;
begin
  maxX := PaintBox1.Width;
  maxY := PaintBox1.Height;
  // Построение паруса
  PaintBox1.Canvas.Brush.Color := clYellow;
  PaintBox1.Canvas.Polygon([Point(250,maxY-35), Point(280, maxY-250), Point(150, maxY-65)]);
  // Построение корпуса лодки
  PaintBox1.Canvas.Brush.Color := RGBToColor(150, 150, 0);
  PaintBox1.Canvas.Polygon([Point(50,maxY-25),
                            Point(300,maxY-25), Point(340,maxY-50)]);
  // Построение волн в виде полуокружностей.
  PaintBox1.Canvas.Brush.Color := clBlue;
  x:=0;
  while x < maxX do begin
    PaintBox1.Canvas.Pie(0 + x, maxY, 40 + x, maxY-30,
                         40 + x, maxY-15, 0 + x, maxY-15 );
    x := x+30;
  end;
end;
 
Bezprovodnoi Оффлайн

Bezprovodnoi

Знающий кодер
Принятый Кодер
Сообщения
3
Симпатии
1
Баллы
40
Ошибка. Delphi XE6 ругается на RGBToColor
 
Последнее редактирование:
Sascha Оффлайн

Sascha

Заместитель Администратора
Команда форума
Администратор
Сообщения
1,058
Симпатии
272
Баллы
155
Ошибка. Delphi XE6 ругается на RGBToColor
В Delphi XE6 нету этого компонента RGBToColor нужно писать просто RGB
PaintBox1.Canvas.Brush.Color := RGBToColor(200,160,0); - Lazaus
PaintBox1.Canvas.Brush.Color := RGB(200,160,0); - Delphi
 
Вверх Снизу