Уроки, алгоритмы, программы, примеры

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Среда программирования: 
PascalABC.NET

Обычно начинающие программисты рисуют графические изображения. указывая координаты непосредственно в месте рисования графического объекта.

Например :

uses GraphABC;
 
begin
rectangle(50,50,450,450); // рамка
setbrushcolor(clBlack); // цвет заливки (рисуем только чёрные ячейки)
 
  Rectangle(100,50,150,100); 
  Rectangle(200,50,250,100);
  Rectangle(300,50,350,100);
  Rectangle(400,50,450,100);
 
  Rectangle(50,100,100,150);
  Rectangle(150,100,200,150);
  Rectangle(250,100,300,150);
  Rectangle(350,100,400,150);
 
  Rectangle(100,150,150,200); 
  Rectangle(200,150,250,200);
  Rectangle(300,150,350,200);
  Rectangle(400,150,450,200);
 
  Rectangle(50,200,100,250);
  Rectangle(150,200,200,250);
  Rectangle(250,200,300,250);
  Rectangle(350,200,400,250);
 
  Rectangle(100,250,150,300); 
  Rectangle(200,250,250,300);
  Rectangle(300,250,350,300);
  Rectangle(400,250,450,300);
 
  Rectangle(50,300,100,350);
  Rectangle(150,300,200,350);
  Rectangle(250,300,300,350);
  Rectangle(350,300,400,350);
 
  Rectangle(100,350,150,400); 
  Rectangle(200,350,250,400);
  Rectangle(300,350,350,400);
  Rectangle(400,350,450,400);
 
  Rectangle(50,400,100,450);
  Rectangle(150,400,200,450);
  Rectangle(250,400,300,450);
  Rectangle(350,400,400,450);
 
end.

Результат:

Несмотря на то, что белые ячейки мы не рисовали, код все равно громоздкий .

Поэтому лучше попытаться сделать то же самое с помощью циклов...

While, или цикл с предусловием

Как вы, наверное, уже поняли из названия, while — это цикл, в котором условие стоит перед телом. Причем тело цикла выполняется тогда и только тогда, когда условие true; как только условие становится false, выполнение цикла прекращается.

While имеет формат:

while < условие> do <оператор 1>; {Пока … делай ….}

Данный цикл подходит только для одного оператора, если же вы хотите использовать несколько операторов в своем коде, вам следует заключить их в операторные скобки — begin и end; .

Repeat, или цикл с постусловием

Repeat — полная противоположность while. Repeat — это цикл, в котором условие стоит после тела. Причем оно выполняется тогда и только тогда, когда результат условия false; как только логическое выражение становится true, выполнение цикла прекращается.

Repeat имеет формат:

repeat { повторяй … }
< оператор 1>;
< оператор 2>;

until {до…} <условие>

Begin и end не требуются.

For, или цикл с параметром

For — это цикл, в котором тело выполняется заданное количество раз.

Существует две формы записи этого цикла

Первая форма:
for <счетчик1> := <значение1> to <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик1> будет увеличиваться на 1.
<значение1> — это начальное значение счетчика. Это может быть переменная или число.
<конечное_значение> : как только значение <счетчик1> станет больше <конечное_значение>, выполнение цикла прекратится.
Если требуется написать несколько операторов в теле цикла, используем begin и end.
И <счетчик1>, и <конечное_значение>, и <значение1> — переменные целого типа.
Чаще всего в качестве счетчика используется переменная i.

Вторая форма:
for <счетчик2> := <значение2> downto <конечное_значение> do <оператор1>;
После каждой итерации значение <счетчик2> будет уменьшатся на 1.
<значение2> — это начальное значение счетчика.
<конечное_значение> : как только значение <счетчик2> станет меньше <конечное_значение>, выполнение цикла прекратится.

Важно:

  1. Цикл повторяется, пока значение значение счетчика лежит в отрезке [значение ; конечное_значение].
  2. Изменять значение счетчика внутри тела нельзя!

Нарисуем шахматную доску с помощью цикла:

uses GraphABC;
var
i,j: integer;
 
begin
rectangle(50,50,450,450); // рамка
 
setbrushcolor(clBlack); // заливка
  for i:=1 to 8 do
  for j:=1 to 8 do
      if odd(i+j) then // если сумма индексов i+j - нечетная, то... 
        Rectangle(i*50+50,j*50+50,i*50,j*50);
 
 end.

Согласитесь, данный код проще и лаконичнее, чем предыдущий. И цикл for — не совсем обычный цикл, в нем нет логического условия. Другими словами , цикл с параметром — это дополнения синтаксиса языка программирования, которые не добавляют новых возможностей, а делают использование языка более удобным для человека.

Для полноты картины пронумераем шахматные клетки с помощью еще одного цикла:

for i:=0 to 7 do
begin
  setbrushcolor(clwhite);
    TextOut(70+i*50,453,chr(97+i));
    TextOut(70+i*50,33,chr(97+i));
     // горизонталь
    TextOut(37,70+i*50,chr(56-i));
    TextOut(453,70+i*50,chr(56-i));
    // вертикаль
  end;

Результат:

Ещё один пример , но теперь c циклом while :

Код без цикла:

uses graphABC;
begin
setwindowsize(640,200); // зададим размер окна
clearwindow(clBlack);
Brush.Color :=clWhite;  
 
     // 1й ряд
    circle(20,20,20);
    circle(60,20,20);
    circle(100,20,20);
    circle(140,20,20);
    circle(180,20,20);
    circle(220,20,20);
    circle(260,20,20);
    circle(300,20,20);
    circle(340,20,20);
    circle(380,20,20);
    circle(420,20,20);
    circle(460,20,20);
    circle(500,20,20);
    circle(540,20,20);
    circle(580,20,20);
    circle(620,20,20);
 
    // 2й ряд
    circle(20,60,20);
    circle(60,60,20);
    circle(100,60,20);
    circle(140,60,20);
    circle(180,60,20);
    circle(220,60,20);
    circle(260,60,20);
    circle(300,60,20);
    circle(340,60,20);
    circle(380,60,20);
    circle(420,60,20);
    circle(460,60,20);
    circle(500,60,20);
    circle(540,60,20);
    circle(580,60,20);
    circle(620,60,20);
 
    // 3й ряд
    circle(20,100,20);
    circle(60,100,20);
    circle(100,100,20);
    circle(140,100,20);
    circle(180,100,20);
    circle(220,100,20);
    circle(260,100,20);
    circle(300,100,20);
    circle(340,100,20);
    circle(380,100,20);
    circle(420,100,20);
    circle(460,100,20);
    circle(500,100,20);
    circle(540,100,20);
    circle(580,100,20);
    circle(620,100,20);
 
    // 4й ряд
    circle(20,140,20);
    circle(60,140,20);
    circle(100,140,20);
    circle(140,140,20);
    circle(180,140,20);
    circle(220,140,20);
    circle(260,140,20);
    circle(300,140,20);
    circle(340,140,20);
    circle(380,140,20);
    circle(420,140,20);
    circle(460,140,20);
    circle(500,140,20);
    circle(540,140,20);
    circle(580,140,20);
    circle(620,140,20);
 
    // 5й ряд
    circle(20,180,20);
    circle(60,180,20);
    circle(100,180,20);
    circle(140,180,20);
    circle(180,180,20);
    circle(220,180,20);
    circle(260,180,20);
    circle(300,180,20);
    circle(340,180,20);
    circle(380,180,20);
    circle(420,180,20);
    circle(460,180,20);
    circle(500,180,20);
    circle(540,180,20);
    circle(580,180,20);
    circle(620,180,20);
end.

Результат:

А теперь нарисуем с помощью while :

uses graphABC;
var x,y,r:integer;
begin
setwindowsize(640,200); // зададим размер окна
r:=20; // радиус
y:=r; 
clearwindow(clBlack); 
while y<=windowheight-r do // пока "игрик" меньше высоты окна с учетом радиуса:
 begin
  x:=r; 
  while x<=windowwidth-r do // пока "икс" меньше ширины окна с учетом радиуса делаем
   begin
    Brush.Color :=clWhite;  // рисуем круги белым цветом
    circle(x,y,r);
    x:=x+2*r   
   end;
   y:=y+2*r
 end;
end.

Результат: