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


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

Сатурн и его кольца на экране монитора

Уважаемые читатели!

У газеты-вкладки “В мир информатики” появился свой электронный адрес: vmi@1september.ru.

Как, конечно, известно читателям, в языках программирования Бейсик и Паскаль имеется процедура CIRCLE, изображающая на экране окружность. Но часто в программах нужно получить не окружность, а эллипс. Как это сделать?

В языке Бейсик эллипс можно получить, используя ту же процедуру CIRCLE, но указав, кроме координат центра х и у, радиуса и цвета линии, его дополнительный параметр — отношение:

CIRCLE (х, у), радиус, цвет, угол1, угол2, отношение

О параметрах угол1 и угол2 поговорим чуть ниже, а здесь скажем, что при рисовании “полных” окружности и эллипса их можно не указывать:

CIRCLE (х, у), радиус, цвет, , , отношение

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

В языке программирования Паскаль для изображения эллипса имеется процедура с характерным именем ELLIPSE. Ее общий вид:

ELLIPSE (х, у, угол1, угол2, Rx, Ry)

В нем параметры х и у задают координаты центра эллипса Rx и Ry — определяют максимальные размеры фигуры по горизонтали и по вертикали (параметры угол1 и угол2, как и в Бейсике, не являются обязательными и будут описаны позже).

Рассмотрим несколько программ, в которых изображаются эллипсы.

Как принято в нашей газете, они написаны на школьном алгоритмическом языке. Русский синтаксис этого языка делает программы максимально понятными, и вы сможете разработать аналогичные программы на известном вам языке программирования. Заметим также, что с целью единообразия с другими языками с точки зрения получения эллипсов оформление процедуры окружность в программах проведено не по правилам школьного алгоритмического языка.

1. “Черная дыра” (рис. 1)

Рис. 1

алг Черная_дыра

нач цел x, y, r, i

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

видео(18)

|Рисуем 50 эллипсов

нц для i от 50 до 1 шаг –1

x := цел(максX/2)

y = 50 + 900/i

r = 3 * i

окружность(x, y), r, , , 0.3

кц

кон

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

2. Сатурн и его кольца (рис. 2)

Рис. 2

алг Сатурн_и_его_кольца

нач цел x, y, r, i

видео(18)

x := цел(максX/2)

y := цел(максY/2)

|Рисуем окружность-планету

нц для r от 79 до 81

окружность(x, y), r

|Рисуя окружность трижды,

|получаем жирную линию

кц

|Рисуем 6 колец-эллипсов

нц для i от 1 до 26 шаг 5

окружность(x, y - 7), 100 + i, , , 0.3

кц

кон

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

Однако если выполнить программу, то можно увидеть, что полученное изображение будет отличаться от приведенного на рис. 2, — часть каждого кольца-эллипса, находящаяся за окружностью-планетой, будет видна. Желательно (чтобы усилить пространственный эффект) эти части удалить, но для этого надо уметь получать “неполные” эллипсы (дуги).
В языке программирования Паскаль это можно сделать с помощью процедуры ARC, общий вид которой:

ARC(х, у, угол1, угол2, радиус)

— где угол1 — начальный угол дуги — части окружности, угол2 — конечный угол. Эти величины измеряются в радианах, значение равно нулю, когда радиус направлен горизонтально слева направо. Кроме того, предполагается, что дуга вычерчивается против часовой стрелки (рис. 3). Следовательно, чтобы построить полуокружность, обращенную вверх (рис. 4), нужно начальный угол задать равным нулю, а конечный — p рад. Если же полуокружность должна быть обращена вниз (рис. 5), то начальный угол равен p рад, а конечный — 2p рад.

Рис. 3

Рис. 4

Рис. 5

В языке Бейсик для получения “неполного” эллипса используется все та же процедура CIRCLE, но уже с параметрами угол1 и угол2 (см. выше). Их смысл аналогичен таким же параметрам в процедуре ARC в Паскале.

Фрагмент программы, в которой невидимые части эллипсов не показываются, выглядит так:

|Рисуем 6 колец-эллипсов

k0 = 0.77; k2 = 0.77

нц для i от 1 до 26 шаг 5

k0 := k0 - 0.02; k1 := k0 * 3.1415

k2 := k2 + 0.05

окружность(x, y - 7), 100 + i, k1, k2, 0.3

кц

Не желая, чтобы читатель “ломал” себе голову (для этого в нашей газете есть специальная рубрика — :) ) в размышлениях о том, как рассчитаны начальные и конечные точки дуг (значения параметров k0, k1 и k2), имитирующих кольца Сатурна, признаемся, что они были выбраны методом проб и ошибок.

3. Ваза (рис. 6)

Рис. 6

алг Ваза

нач цел x, y, r, i

видео(18)

|Основная часть вазы

нц для i от 15 до 2 шаг -1

r := 120 * COS(3.1415/i)

y := 80 * SIN(3.1415/i)

окружность(цел(максX/2), 20 + y), r, , , 0.3

кц

|Ножка

y2 := y

нц для i от 10 до 65 шаг 5

r := 20/(i/15)

окружность(цел(максX/2), y2 + i), r, , , 0.3

кц

|Основание

y3 := y2 + 65

нц для i от 2 до 10

r := 2 * exp(i/3)

окружность(цел(максX/2), y3 + i), r, , , 0.3

кц

кон

Задания для самостоятельной работы

1. Разработайте программы, аналогичные приведенным, на языке программирования, которым вы владеете.

2. Разработайте программу, изображающую бокал с окрашенной жидкостью.

3. Разработайте вариант программы Ваза , в которой невидимые линии на рисунке не показываются.

Программы (можно не все), пожалуйста, пришлите в редакцию. Фамилии всех приславших правильные программы будут опубликованы, а лучшие ответы мы поощрим.

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

Литература

1. Грайс Д. Графические средства персонального компьютера. М.: Мир, 1989.

TopList