В свободную минуту
В свободную минуту
Наверное, каждый человек, увлекающийся программированием, затруднится ответить, чем же притягивает его это занятие. Всегда есть разница между людьми, просто что-либо делающими, и людьми увлеченными, что хорошо заметно при сравнении обычного инженера с изобретателем. Указать, в чем она состоит, разумеется, непросто. Возможно, увлеченные программисты, будь они профессионалами или любителями, испытывают побуждения, родственные изобретательским? Скорее всего нет и не будет ответа на вопрос, в чем коренное отличие энтузиаста от нормального человека.
Если не заниматься глубинными философско-психологическими изысканиями, а ограничиться внешней стороной дела, то можно накопить ряд интересных наблюдений. Опыт общения с увлеченными любителями программирования свидетельствует, что компьютерные игры завораживают их в меньшей степени, чем других. Играть-то они играют, но зачастую предпочитают развлечения иного рода.
К одному из них меня когда-то приобщили. С тех пор прошло много лет, но самое интересное, что игра не забывается. Время от времени случается ее показать товарищам, да и сам раз в год сыграешь. Каким бы простым ни было это занятие, оно действительно способно увлечь. Познакомьтесь с ним и вы.
Нам понадобится какой-нибудь немудреный язык программирования, лучше всего QBASIC или другой интерпретатор. Суть развлечения состоит в изобретении красивых и/или интересных геометрических кривых, произведенных из окружности. Для этого берется уравнение окружности и всячески видоизменяется.
Давайте начнем с самого начала - нарисуем окружность.
CONST PI = 3.141592654# CONST degree = PI / 180! CONST a360 = 2! * PI SCREEN 12 r = 200! x0 = 320! y0 = 240! FOR i = 0! TO a360 STEP degree / 2! x = r * COS(i) y = r * SIN(i) PSET (x + x0, y + y0) NEXT i Шаг величиной один градус оказался великоват, вот и пришлось уменьшить его вдвое. Ладно, окружность начертить нетрудно. А слабо сделать из нее спираль Архимеда, сходящуюся к центру за 10 оборотов? Ни секунды не сомневаюсь, что вы справитесь с заданием. Всего-то дел, что добавить внешний цикл и организовать уменьшение длины радиуса на каждом элементарном шаге. Но я также не сомневаюсь, что, прежде чем у вас получится спираль, окажется изобретенной пара-тройка фигур, отличных от нее. Причина тому проста: занимаясь несерьезным делом, не сразу включаешь голову - и получаешь неожиданные результаты. Например, у меня вышла фигура, внешний вид которой я предлагаю угадать по формулам. Интересно, насколько верной будет ваша догадка? r = 200! x0 = 320! y0 = 240! FOR j = 0 TO 9 FOR i = 0! TO a360 STEP degree / 2! r = r - 20! / 360! x = r * COS(i) y = r * SIN(i) PSET (x + x0, y + y0) NEXT i NEXT j Рассуждал я так: чтобы за 10 оборотов радиус уменьшился от 200 до 0, за один оборот он должен убывать на 20. Один оборот - 360 градусов, значит, на каждом элементарном шаге радиус следует уменьшать на 1/18 градуса (20/360). Конечно, этот вывод ошибочен, что не слишком огорчает, поскольку благодаря ошибке оказался открытым способ развернуть спираль в обратном направлении. Иначе говоря, нарисовать две спирали за один раз. Подозреваю, не окажись декремент радиуса вдвое больше, чем нужно, этот способ ни за что не пришел бы в голову.
Развлечение в том и состоит, чтобы задумать какую-либо фигуру и начать ее строить, открывая неожиданные свойства формул. Можно поступать наоборот: угадывать, что получится после того или иного изменения, внесенного в формулы. Наконец, никто не запрещает просто хулиганить, играя параметрами, как Бог на душу положит.
Попробуем-ка соорудить из спиралей рисунок, напоминающий башню Шухова.
x0 = 320! y0 = 240! FOR k = 0 TO 6 r = 200! FOR j = 0 TO 4 FOR i = 0 + k TO a360 + k STEP degree / 2! r = r - 40! / 360! x = r * COS(i) y = r * SIN(i) PSET (x + х0, y + y0) NEXT i NEXT j NEXT k По-моему, симпатично получились. А теперь я просто приведу фрагменты программ, строящих разные рисунки. Вот это - "комета": rc = 100! x0 = 320! y0 = 240! r = 60! FOR i = 0 TO a360 STEP degree / 8 x = r * COS(i) y = r * SIN(i) xc = x0 + rc * COS(i * 16) yc = y0 + rc * SIN(i * 8) PSET (x + xc, y + yc) NEXT iТеперь - "цветок": rc = 100! x0 = 320! y0 = 240! r = 100! FOR i = 0 TO a360 STEP degree / 8 x = r * COS(i) y = r * SIN(i) xc = x0 + rc * COS(i * 6) yc = y0 + rc * SIN(i * 6) PSET (x + xc, y + yc) NEXT i Теперь - "листья": x0 = 320! y0 = 240! r = 100! FOR i = 0 TO a360 STEP degree / 4 x = 2 * r * COS(i + SIN(4 * i)) y = r * SIN(i + COS(4 * i)) PSET (x + x0, y + y0) NEXT i Эта фигура довольно неожиданная - "квадрат": x0 = 320! y0 = 240! r = 200! a = 0! b = 0! FOR i = 0 TO a360 STEP degree / 50! a = a + i b = a / 4! x = r * COS(b) * SIN(i) y = r * SIN(b) * COS(i) PSET (x + x0, y + y0) NEXT i Наконец, предпоследняя из предлагаемых фигур - "звезда": x0 = 320! y0 = 240! r = 200! n = 36! dr = r / 360! / n k = 0! FOR j = 1 TO n FOR i = 0 TO a360 STEP degree k = k + dr x = k * COS(i) y = (r - k) * SIN(i) PSET (x + x0, y + y0) NEXT i NEXT j Следующая фигура представляет собою вариацию предыдущей. Обратите внимание, как ничтожное изменение влияет на вид фигуры в целом.
x0 = 320! y0 = 240! r = 200! n = 18! dr = r / 360! / n k = 0! FOR j = 1 TO n FOR i = 0 TO a360 STEP degree / 2 k = k + dr x = k * COS(i) y = (r - k) * SIN(i) PSET (x + x0, y + y0) NEXT i NEXT j Как видите, занятие не из сложных. Пожалуй, оно должно привлекать людей, склонных к решению головоломок, с одной стороны, и любящих повозиться с "тонкой настройкой" - с другой.
Иногда, придумав какую-либо фигуру, начинаешь варьировать ее формообразующие параметры и замечаешь завидную устойчивость формы. Но так бывает не всегда: случается, что небольшие изменения значений параметров, кажущиеся второстепенными, совершенно изменяют вид фигуры. В таких случаях следует почаще сохраняться. Не то мелькнет интересная картинка, тут же радикально изменится, а потом ее уже не отыскать вновь.
Конечно, я не думаю, будто все читатели немедленно забросят свои любимые развлечения и начнут исступленно складывать гармонические колебания. Но согласитесь, что попробовать это занятие - дело минут. Как знать: если кто-нибудь попробует, то, может быть, ему и понравится.
Евгений Щербатюк
Наверное, каждый человек, увлекающийся программированием, затруднится ответить, чем же притягивает его это занятие. Всегда есть разница между людьми, просто что-либо делающими, и людьми увлеченными, что хорошо заметно при сравнении обычного инженера с изобретателем. Указать, в чем она состоит, разумеется, непросто. Возможно, увлеченные программисты, будь они профессионалами или любителями, испытывают побуждения, родственные изобретательским? Скорее всего нет и не будет ответа на вопрос, в чем коренное отличие энтузиаста от нормального человека.
Если не заниматься глубинными философско-психологическими изысканиями, а ограничиться внешней стороной дела, то можно накопить ряд интересных наблюдений. Опыт общения с увлеченными любителями программирования свидетельствует, что компьютерные игры завораживают их в меньшей степени, чем других. Играть-то они играют, но зачастую предпочитают развлечения иного рода.
К одному из них меня когда-то приобщили. С тех пор прошло много лет, но самое интересное, что игра не забывается. Время от времени случается ее показать товарищам, да и сам раз в год сыграешь. Каким бы простым ни было это занятие, оно действительно способно увлечь. Познакомьтесь с ним и вы.
Нам понадобится какой-нибудь немудреный язык программирования, лучше всего QBASIC или другой интерпретатор. Суть развлечения состоит в изобретении красивых и/или интересных геометрических кривых, произведенных из окружности. Для этого берется уравнение окружности и всячески видоизменяется.
Давайте начнем с самого начала - нарисуем окружность.
CONST PI = 3.141592654# CONST degree = PI / 180! CONST a360 = 2! * PI SCREEN 12 r = 200! x0 = 320! y0 = 240! FOR i = 0! TO a360 STEP degree / 2! x = r * COS(i) y = r * SIN(i) PSET (x + x0, y + y0) NEXT i Шаг величиной один градус оказался великоват, вот и пришлось уменьшить его вдвое. Ладно, окружность начертить нетрудно. А слабо сделать из нее спираль Архимеда, сходящуюся к центру за 10 оборотов? Ни секунды не сомневаюсь, что вы справитесь с заданием. Всего-то дел, что добавить внешний цикл и организовать уменьшение длины радиуса на каждом элементарном шаге. Но я также не сомневаюсь, что, прежде чем у вас получится спираль, окажется изобретенной пара-тройка фигур, отличных от нее. Причина тому проста: занимаясь несерьезным делом, не сразу включаешь голову - и получаешь неожиданные результаты. Например, у меня вышла фигура, внешний вид которой я предлагаю угадать по формулам. Интересно, насколько верной будет ваша догадка? r = 200! x0 = 320! y0 = 240! FOR j = 0 TO 9 FOR i = 0! TO a360 STEP degree / 2! r = r - 20! / 360! x = r * COS(i) y = r * SIN(i) PSET (x + x0, y + y0) NEXT i NEXT j Рассуждал я так: чтобы за 10 оборотов радиус уменьшился от 200 до 0, за один оборот он должен убывать на 20. Один оборот - 360 градусов, значит, на каждом элементарном шаге радиус следует уменьшать на 1/18 градуса (20/360). Конечно, этот вывод ошибочен, что не слишком огорчает, поскольку благодаря ошибке оказался открытым способ развернуть спираль в обратном направлении. Иначе говоря, нарисовать две спирали за один раз. Подозреваю, не окажись декремент радиуса вдвое больше, чем нужно, этот способ ни за что не пришел бы в голову.
Развлечение в том и состоит, чтобы задумать какую-либо фигуру и начать ее строить, открывая неожиданные свойства формул. Можно поступать наоборот: угадывать, что получится после того или иного изменения, внесенного в формулы. Наконец, никто не запрещает просто хулиганить, играя параметрами, как Бог на душу положит.
Попробуем-ка соорудить из спиралей рисунок, напоминающий башню Шухова.
x0 = 320! y0 = 240! FOR k = 0 TO 6 r = 200! FOR j = 0 TO 4 FOR i = 0 + k TO a360 + k STEP degree / 2! r = r - 40! / 360! x = r * COS(i) y = r * SIN(i) PSET (x + х0, y + y0) NEXT i NEXT j NEXT k По-моему, симпатично получились. А теперь я просто приведу фрагменты программ, строящих разные рисунки. Вот это - "комета": rc = 100! x0 = 320! y0 = 240! r = 60! FOR i = 0 TO a360 STEP degree / 8 x = r * COS(i) y = r * SIN(i) xc = x0 + rc * COS(i * 16) yc = y0 + rc * SIN(i * 8) PSET (x + xc, y + yc) NEXT iТеперь - "цветок": rc = 100! x0 = 320! y0 = 240! r = 100! FOR i = 0 TO a360 STEP degree / 8 x = r * COS(i) y = r * SIN(i) xc = x0 + rc * COS(i * 6) yc = y0 + rc * SIN(i * 6) PSET (x + xc, y + yc) NEXT i Теперь - "листья": x0 = 320! y0 = 240! r = 100! FOR i = 0 TO a360 STEP degree / 4 x = 2 * r * COS(i + SIN(4 * i)) y = r * SIN(i + COS(4 * i)) PSET (x + x0, y + y0) NEXT i Эта фигура довольно неожиданная - "квадрат": x0 = 320! y0 = 240! r = 200! a = 0! b = 0! FOR i = 0 TO a360 STEP degree / 50! a = a + i b = a / 4! x = r * COS(b) * SIN(i) y = r * SIN(b) * COS(i) PSET (x + x0, y + y0) NEXT i Наконец, предпоследняя из предлагаемых фигур - "звезда": x0 = 320! y0 = 240! r = 200! n = 36! dr = r / 360! / n k = 0! FOR j = 1 TO n FOR i = 0 TO a360 STEP degree k = k + dr x = k * COS(i) y = (r - k) * SIN(i) PSET (x + x0, y + y0) NEXT i NEXT j Следующая фигура представляет собою вариацию предыдущей. Обратите внимание, как ничтожное изменение влияет на вид фигуры в целом.
x0 = 320! y0 = 240! r = 200! n = 18! dr = r / 360! / n k = 0! FOR j = 1 TO n FOR i = 0 TO a360 STEP degree / 2 k = k + dr x = k * COS(i) y = (r - k) * SIN(i) PSET (x + x0, y + y0) NEXT i NEXT j Как видите, занятие не из сложных. Пожалуй, оно должно привлекать людей, склонных к решению головоломок, с одной стороны, и любящих повозиться с "тонкой настройкой" - с другой.
Иногда, придумав какую-либо фигуру, начинаешь варьировать ее формообразующие параметры и замечаешь завидную устойчивость формы. Но так бывает не всегда: случается, что небольшие изменения значений параметров, кажущиеся второстепенными, совершенно изменяют вид фигуры. В таких случаях следует почаще сохраняться. Не то мелькнет интересная картинка, тут же радикально изменится, а потом ее уже не отыскать вновь.
Конечно, я не думаю, будто все читатели немедленно забросят свои любимые развлечения и начнут исступленно складывать гармонические колебания. Но согласитесь, что попробовать это занятие - дело минут. Как знать: если кто-нибудь попробует, то, может быть, ему и понравится.
Евгений Щербатюк
Компьютерная газета. Статья была опубликована в номере 12 за 1997 год в рубрике программирование :: разное