Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №2/2009


В мир информатики
Школа программирования

Убегающий квадрат

Изображение, показанное на рисунке ниже, на первый взгляд кажется достаточно сложным, но при более внимательном рассмотрении оказывается, что оно образовано вложенными один в другой квадратами*. Вершины каждого следующего квадрата находятся на сторонах предыдущего и делят их в заданном отношении k. Таким образом, квадраты не только становятся все меньше и меньше, но и поворачиваются на некоторый угол.

Исходными данными для построения изображения являются:

— сторона внешнего квадрата а;

— координаты левого верхнего угла этого квадрата х1 и у1;

— отношение k (см. чуть выше);

— количество вложенных квадратов n.

Для нахождения координат углов очередного квадрата можно использовать следующие соотношения, позволяющие по известным координатам концов отрезка (х1, y1), (х2, y2) и заданному соотношению k, в котором некоторая точка делит этот отрезок, определить координаты этой точки:

x = x1 + k(x2 – x1);

y = y1 + k(y2 – y1).

В приведенной ниже программе (на школьном алгоритмическом языке) координаты углов очередного квадрата имеют имена х11, у11, …, х44, у44. Так как их значения зависят от координат двух углов предыдущего квадрата, то для того, чтобы использовать оператор цикла с параметром k:

1) в теле оператора цикла рассчитываются значения х11, у11, …, х44, у44;

2) эти значения присваиваются величинам х1, у1, …, х4, у4;

3) вложенный квадрат строится по значениям величин х1, у1, …, х4, у4.

Итак, программа:

алг Убегающий_квадрат

нач цел a, n, x1, y1, x2, y2, x3,

y3, x4, y4, вещ k

цел x11, y11, x22, y22, x33, y33,

x44, y44, i, j

|Устанавливаем графический режим

видео(18)

a := максY/2

k := 0.9

n := 20

|Координаты левого верхнего угла

|внешнего квадрата

x1 := максX/2 - a/2

y1 := максY/2 - a/2

|Координаты других углов

x2 := x1 + a; y2 := y1

x3 := x2; y3 := y2 + a

x4 := x1; y4 := y3

поз(x1, y1)

|Внешний квадрат

линия(x2, y2)

линия(x3, y3)

линия(x4, y4)

линия(x1, y1)

нц для i от 1 до n

Пауза

|Координаты углов

|очередного вложенного квадрата

x11 := x1 + k * (x2 - x1)

y11 := y1 + k * (y2 - y1)

x22 := x2 + k * (x3 - x2)

y22 := y2 + k * (y3 - y2)

x33 := x3 + k * (x4 - x3)

y33 := y3 + k * (y4 - y3)

x44 := x4 + k * (x1 - x4)

y44 := y4 + k * (y1 - y4)

|Переприсваиваем их значения

x1 := x11; y1 := y11

x2 := x22; y2 := y22

x3 := x33; y3 := y33

x4 := x44; y4 := y44

|Строим вложенный квадрат

поз(x1, y1)

линия(x2, y2)

линия(x3, y3)

линия(x4, y4)

линия(x1, y1)

кц

кон

где мaксX — максимально возможное значение координаты x в выбранном графическом режиме, мaксY — то же, координаты y.

Именем Пауза обозначен фрагмент программы, обеспечивающий некоторую паузу в выводе на экран очередного квадрата (это может быть стандартная процедура, имеющаяся в языке программирования и решающая указанную задачу, или так называемый “пустой цикл”).

Заметим также, что значения х1, у1 и а выбраны таким образом, чтобы наружный квадрат изображался в центре экрана, а его сторона была бы равна половине значения величины мaксY.


* Обратим внимание коллег, что эта задача и ее реализация на РНР рассматривались в № 24/2008.

TopList