Показать сообщение отдельно
Старый 03.04.2012, 16:22   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Хорошо, попробую. Только предупреждаю - АВС не знаю, поэтому буду исходить из здравого смысла.
Прежде всего по процедуре рисования звездочки. Тут так:
Код:
procedure Zvezda(x,y,r:integer);//это создание своей процедуры
var 
 i,a:integer;
 p:array[1..11] of Tpoint; // массив от 1 до 11
begin
 a:=18; 
 for i:=1 to 10 do //если i равно от 1 до 10 то
  begin
   if odd(i) then  //вот эта строчка непонятна {если i 
нечетное, то}
    begin
     p[i].x:=x+round(r*cos(a*pi/180)); //вот эта строчка непонятна
     p[i].y:=y-round(r*sin(a*pi/180));  //вот эта строчка непонятна
    end
{Здесь вычисляются координаты пяти удаленных на 
расстояние r от центра вершин звезды. Угол между ними - 
72°. Если i принимает нечетное значение, то вычисляются 
последовательно X и Y координаты "дальних" пяти точек}
   else {если i - четное}
    begin
     p[i].x:=x+round(r*cos(a*pi/180)/2); //аналогично
     p[i].y:=y-round(r*sin(a*pi/180)/2);  //аналогично
    end;
{Аналогично, но для "ближних" пяти вершин, отстоящих от 
центра на расстояние r/2.}
  a:=a+36;  
 end;
 p[11].x:=p[1].x;   //вот эта строчка непонятна
 p[11].y:=p[1].y;  //вот эта строчка непонятна
{Эти две строки "замыкают" звезду: первая точка (i=1) 
совпадает с последней (i=11)}
 MoveTo(p[1].x,p[1].y);  //здесь перемещается указатель в координаты {первой 
точки}
 setpencolor(clred);  //цвет
 for i:=1 to 11 do  //если i равно от 1 до 10 то
  LineTo(p[i].x,p[i].y); //рисует линию, но по каким координатам?
{Оператор LineTo(X,Y) проводит линию из исходного 
положения указателя в точку, координаты которой указаны 
в его параметрах. Таким образом, исходно установив 
указатель в первую точку, вы в течение цикла проходите 
все 11, последовательно соединяя их линией}
 floodfill(x,y,clgreen); //закрашивает область зелёным
end;
Цитата:
xc:=windowwidth div 2; //вот эта строчка непонятна
yc:=windowheight div 2; //аналогично
{Вычисляются
координаты центра рисунка, равные полуширине (по X) и
полувысоте (по Y) графического окна. Чего же тут
непонятного?}
Цитата:
r:=round(w/30); //похоже здесь что-то округляется
{Угу. Ищется радиус окружности, в
которую вписана звезда, составляющий 1/30 полуширины
окна}

Цитата:
rectangle(xc-w,yc-h,xc+w,yc+h); //вот эта строчка непонятна
{А мне, признаться, непонятно, чего тут
может быть непонятного. Рисуется прямоугольник размером
2*w x 2*h; в качестве параметров подставляются, как это
положено, координаты противолежащих по диагонали
вершин: центр-полуширина, центр-полувысота,
центр+полуширина, центр+полувысота}

Цитата:
for x:=xc-w+r to xc+w-r do //вот эта строчка непонятна
for y:=yc-h+r to yc+h-r do //аналогично
if (x mod (2*r)=0)and(y mod (2*r)=0) then Zvezda(x,y,r); //не понятно условие
{А это просто цикл, располагающий
звезды внутри прямоугольника так, чтобы они шли
последовательно впритык и не перекрывались. Для этого
делается (ужас, вообще-то!!!) перебор по всем пикселам
внутри прямоугольника, и те из них, координаты которых
кратны диаметру описанной вокруг звезды окружности,
принимаются за центры звезд.}
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070