Специалист
Регистрация: 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); //не понятно условие
|
{А это просто цикл, располагающий
звезды внутри прямоугольника так, чтобы они шли
последовательно впритык и не перекрывались. Для этого
делается (ужас, вообще-то!!!) перебор по всем пикселам
внутри прямоугольника, и те из них, координаты которых
кратны диаметру описанной вокруг звезды окружности,
принимаются за центры звезд.}
|