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

Вход на сайт

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

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

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

Здравствуйте. Спасибо за проект. У меня вопрос, по какой причине определение принадлежности точки многоугольнику работает некорректно, если координаты из больших чисел состоят, например: int[] vertex = new int[] {...
Сейчас проверила нашла причину не запускания // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; //вот тут...
Ну..кажется что то пошло не так http://pp.usera...
Пример, к которому вы оставили комментарий строит именно то самое изображение на языке с#, которое вам необходимо. Отличается только цветовая палитра.

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

Рейтинг@Mail.ru
Звезд отели в городе гоа: отели гоа 5 звезд http://www.tui.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.

Результат: