Лабораторная работа_7_ТА. Для построения движущихся изображений на экране
Скачать 77.23 Kb.
|
Лабораторная работа №7 Разработка и построение блок-схем алгоритмов с использованием графических возможностей среды программирования BASIC-256 Цель: - научиться использовать графические операторы BASIC-256 для построения движущихся изображений на экране; - научиться использовать операторы BASIC-256 для работы с файлами – изучить примеры программ из книги [1]. В BASIC-256 предусмотрен следующий набор операторов для работы с текстовыми файлами [1] Оператор Close — закрывает открытый файл. Если никакой файл не открыт, никаких действий не выполняет. Оператор Eof, eof() — возвращает двоичный флаг (признак, имеющий значения true/false или 1/0). Он сигнализирует о том, что прочитан символ конца файла End Of File (EOF). Чаще всего используется в операторах анализа условий или в циклах с условиями, например, следующего вида: if not eof then … end if; while not eof … end while; do … until eof. Функция eof возвращает истину (true) если достигнут конец файла в процессе чтения и ложь (false) в если ещё есть не прочтённые данные. Если номер_файла не указан используется значение нуль (0). Оператор Open file$ — открывает для чтения и записи файл, полное обозначение которого задано строковой переменной file$. Полное обозначение или спецификация файла — это его обозначение в командных строках операционной системы, включающее путь и собственно обозначение файла. Одновременно может быть открыт только один файл. Если файл не существует на указанном в переменной file$ пути, оператор open создает пустой файл с указанным в переменной file$ именем и расширением. Open выражение; open (выражение); open номер_файла, выражение open (номер_файла, выражение). Открывает указанный переменной выражение файл, задавая ему указанный номер_файла. Если файл не существует, создаётся новый файл так, что в него можно добавлять информацию (см. операторы write и writeln). Не забудьте выполнить команду close, когда ваша программа закончит работать с файлом. BASIC-256 может открыть одновременно не более восьми (8) файлов с номерами от 0 до 7. Если номер файла не указан, он открывается с номером нуль (0). Оператор Exists (path$) — возвращает двоичный флаг (true/false или 1/0), который указывает, существует или не существует указанный в строковой переменной path$ путь к файлу. Оператор Read, read() — читает фрагмент очередной строки (token) из открытого в данный момент файла. Ограничителями фрагмента строки могут быть следующие символы в различных комбинациях: пробелы, символы табуляции (tab), символы конца строки (перевод строки, возврат каретки). Оператор read используется в конструкциях вида x = read, y$ = read в зависимости от типа читаемых из строки данных. Оператор Readline, readline () — читает из открытого в данный момент файла очередную строку целиком. Используется в конструкции вида x$ = readline. Readline; readline (); readline (номер_файла) Возвращает прочитанную из файла строку. Если достигнут конец файла [eof (номер_файла)=true], тогда функция возвращает пустую строку ("") Если номер_файла не указан используется значение нуль (0). Оператор Reset — очищает открытый в настоящее время файл. Все данные, хранившиеся ранее в файле, теряются. Указатель помещается в начало первой строки файла. Оператор Write S$ — записывает строку S$ в конец открытого файла, в текущую строку. Оператор Writeline S$ — добавляет строку S$ в конец файла с новой строки. Writeline выражение; writeline (выражение); writeline номер_файла, выражение. Записывает значение аргумента выражение в открытый файл и добавляет символ конца строки. Указатель файла перемещается в конец записи так, что следующая команда записи запишет данные непосредственно за этими. Если номер_файла не указан, используется нулевой номер (0). Оператор Seek location — перемещает указатель, который указывает место чтения или записи в открытом файле, на заданное в переменной location число байтов от начала файла. Оператор Size, size() — возвращает размер открытого в данный момент файла в байтах. Size size () size(номер_файла) Возвращает длину файла в байтах. Если номер_файла не указан используется значение нуль (0). Close; close (); close(номер_файла). Функция close закрывает ввод/вывод в файл и позволяет другому файлу использовать тот же номер. Если номер_файла не указан используется значение нуль (0). Джеймс М. Рено, М.С. Хотите научиться программировать? - Copyright ©2010. Никитенко С. Г. Свободное программное обеспечение. BASIC-256 для школы. — СПб.: БХВ-Петербург, 2011. — 224 с. Текстовые файлы - единственный вид файлов, с помощью которых возможен ввод/вывод данных в BASIC-256. В версии 0.9.6p возможны лишь чтение и запись строковых данных. Операторы вида X = read, X$ = read в этой версии не работают. Чтение возможно только оператором вида X$ = readline строки текста из файла целиком. Для доступа к файлу рекомендуется в специальной переменной F$ сформировать спецификацию файла, т. е. полное обозначение в командной строке с указанием пути. Далее его следует открыть для записи и чтения оператором open F$. Если необходимо читать или дописывать данные в существующий файл, этого достаточно. Если нужно файл очистить от старой информации, используется оператор reset. Если путь указан правильно, а файл не существует, оператор open F$ создает пустой файл. После завершения работы с файлом его следует закрыть оператором close, чтобы не потерять информацию при завершении работы программы. См. Пример 6.7.1 в книге [2] Теоретические сведения по графики в Basic-256 – см. файл ГРАФИКА_256. Окно вывода графики в Basic-256 Для вывода графических объектов в Basic-256 существует специальное окно графического вывода. Координатная сетка в этом окне задаётся осями координат, расположенными несколько непривычно (см. рисунок ниже). Размер можно изменить командой: Graphsize 640, 480 – новы размеры 640х480 точек (пикселей). По умолчанию окно для вывода графики имеет размер 300 пикселей в ширину (х) и 300 пикселей в высоту (y). Пиксель — это самая маленькая точка, которая может быть изображена на мониторе вашего компьютера. Координаты верхнего левого угла — (0,0), а правого нижнего — (299,299). Каждый пиксель может быть представлен двумя числами, первое (x) показывает смещение вправо, второе (y) — смещение вниз. Такой способ маркировки точек известен в математике как, Декартова прямоугольная система координат. Рис. Декартова система координат окна вывода графики Таблица 1. Основные графические операторы
Таблица 2. - названий цветов.
Этот и последующий примеры изучить Задача (Готовый сложный пример) 1. Вывести на графический экран ломаную линию из N отрезков со случайными координатами точек. Отрезки вычерчиваются случайными цветами. N вводится с клавиатуры в диапазоне 10 <= N <= 100. Использовать размер графического экрана по умолчанию и определить его. Анализ задачи Для вычерчивания ломаной из N отрезков необходимо сформировать координаты (N+1) точек. Координаты X1, Y1 начала первого отрезка формируются отдельно (до начала цикла). Координаты концов отрезков X2, Y2 формируются в цикле. После вычерчивания очередного отрезка координаты точки его конца приравниваются координатам начала следующего отрезка. Алгоритм решения задачи 1. Подготовка экрана 2. Ввод N 3. Определение характеристик графического экрана: высоты H и ширины W 4. Формирование координат начальной точки X1, Y1 5. Цикл по I от 1 до N [ (цикл FOR) 6. Формирование случайных координат I-й точки: X2 = Int(W*rand); Y2 = Int(H*rand) 7. Формирование случайного цвета. Интенсивность образующих цветов выбирается случайным образом в диапазоне от 50 до 200: R = 50 + Int(151*rand); G = 50 + Int(151*rand); B = 50 + Int(151*rand) 8. Вычертить отрезок (X1, Y1) — (X2, Y2) 9. X1 = X2; Y1 = Y2] Clg Input "Введите число отрезков N от 32 до 100 N = ", N # Определение характеристик графического экрана H = graphheight: W = graphwidth # Формирование координат и цвета точек. Вывод на графический экран X1 = Int(W*rand): Y1 = Int(H*rand) For I = 1 to N X2 = Int(W*rand): Y2 = Int(H*rand) R = 50 + Int(151*rand) G = 50 + Int(151*rand) B = 50 + Int(151*rand) Color R, G, B line X1, Y1, X2, Y2 X1 = X2: Y1 = Y2 Next I Решение: 1 этап: Анализ задачи (сделать описание постановки задачи). 2 этап:. Исходные данные: описать необходимые для решения задачи переменные (включая массив) и правильно их объявить в программе. 3 этап: Разработать блок-схему алгоритма решения этой задачи. 4 этап: Написать и отладить текст программы в среде программирования BASIC-256. 5 этап: Отлаженную программу показать преподавателю. ПРИМЕЧАНИЕ: Эти этапы решения поставленной задачи применять во всех последующих вариантах заданий. Задание 2: Пример 2 В графическом экране размером 640×480 вычертить фигуру, состоящую из N (N <= 15) вложенных друг в друга правильных K-угольников (K <= 40), каждый из которых окрашен случайным цветом CL. Все многоугольники вписаны в окружности с равномерно изменяющимися радиусами R от R1 до R1/3 с общим центром в центре экрана O(320, 240). Параметры N, K, R1 вводятся с клавиатуры. Окружности на фигуре не отображаются. Анализ задачи Начинать вычерчивание следует с многоугольника наибольшего размера и вычерчивать их последовательно в порядке убывания радиуса описанной окружности R — только в этом случае будут видны все N многоугольников. Для решения задачи, кроме указанных в условии переменных N, K, R, понадобятся следующие дополнительные переменные: DR — шаг изменения радиуса опи-санной окружности: DR = (R – R/3)/(N – 1). X1(K), Y1(K) — массивы абсцисс и ординат вершин текущего многоугольника. P(M), M = 2*K — общий массив координат вершин текущего многоугольника с номером I, с радиусом описанной окружности R = R1 – DR*(I – 1); I = 1, 2, ..., N. Для I = 1 R = R1; для I = N R = R1/3. Если условно обозначить вершины многоугольника и их координаты как A0(X1[0], Y1[0]), A1(X1[1], Y1[1]), ..., AK–1(X1[K–1], Y1[K–1]), то общий массив координат P запишется в следующем виде: P = {X1[0], Y1[0], X1[1], Y1[1], ..., X1[K–1], Y1[K–1]}. Связь между координатами вершин AJ(X1[J], Y1[J]), J = 0, 1, 2, ..., K–1 и элементами массива P получится из последовательности: P[0] = X1[0], P[1] = Y1[0]; P[2] = X1[1], P[3] = Y1[1]; ... P[2*J] = = X1[J], P[2*J+1] = Y1[J]; ... P[2*K–2] = X1[K–1], P[2*K–1] = = Y1[K–1]. Положение начальных вершин многоугольников можно выбрать любым. Для определенности примем, что все начальные вершины располагаются на горизонтальном луче, исходящем из центра экрана параллельно оси X и с тем же направлением. Напомним, что началом координат графического экрана является его левый верхний угол. Ось X при этом направлена горизонтально вправо, ось Y — вертикально вниз. Координаты вершин многоугольников при этом будут описываться через его радиус описанной окружности R следующими соотношениями. Начальные вершины A0: X1[0] = 320 + R; Y1[0] = 240. Произвольные вершины AJ: X1[J] = 320 + R*cos(2*PI*J/K), Y1[J] = 240 + R*sin(2*PI*J/K); J = 0, 1, ..., K–1. Алгоритм и программа будут строиться по конструкции типа "цикл в цикле". Внешний цикл строится по номеру многоугольника I, изменяющемуся от 1 до N. Внутренний цикл формируется по номеру вершины многоугольника J, который изменяется от 0 до K–1. Алгоритм решения задачи Начало 1. Подготовка текстового и графического экранов (установка нужных режимов, очистка) 2. Ввод числа многоугольников N, числа вершин многоугольника K, радиуса описанной окружности первого многоугольника R1 3. Формирование описаний массивов X1(K), Y1(K), P(2*K) 4. Вычисление шага изменения радиуса описанной окружности DR: DR = 2*R1/(3*(N-1)) 5. Внешний цикл по номеру многоугольника I от 1 до N[ 6. Вычисление радиуса описанной окружности R для I-го многоугольника: R = R1 – (I-1)*DR 7. Вычисление и установка случайного цвета I-го многоугольника по составляющим r, g, b: r = 50 + Int(151*rand); g = 50 + Int(151*rand); b = 50 + Int(151*rand) 8. Внутренний цикл по номеру вершины J от 0 до K–1[ 9. Вычисление координат вершины AJ: X1[J] = 320 + R*cos(2*PI*J/K); Y1[J] = 240 + R*sin(2*PI*J/K) 10. Формирование общего массива координат вершин P: P[2*J] = X1[J]; 11. P[2*J+1] = Y1[J]. Конец внутреннего цикла по J:] 12. Вычерчивание I-го многоугольника по массиву координат вершин P. Конец внешнего цикла по I:] Конец # Подготовка графического и текстового экранов Graphsize 640, 480 Cls Clg И.Т.Д. …… Построение движущихся изображений на экране. С помощью цикла определить траекторию движения фигуры. Нарисовать фигуру заданным цветом в начале траектории. Нарисовать фигуру цветом фона на том же месте. Перейти к следующей точке траектории движения. Пример1 # Цикл горизонтального движения отрезка For X = 0 To 300 step 2 COLOR Black Line X, H, X, H+L Pause T COLOR RED CIRCLE X,150,20 Pause T1 Clg Next X End Пример2. clg y=0 color 0,255,255 for y=0 to 300 rect 150,y,20,20 pause 0.01 clg next y clg color 0,0,0 rect 90,90,120,250 for i=1 to 10 color 255,0,0 circle 150,150,50 pause 3 color 0,255,0 circle 150,150,50 pause 3 color 255,255,0 circle 150,150,50 pause 3 next i См. также пример – Полет мячика Варианты заданий На графическом экране размером 540×440 вычертить по центру графического окна координатные оси X , Y и относительно построенных осей нарисовать круг, вписанный в квадрат со стороной А, равной половине оси Х. Цвет круга и квадрата задать случайным цветом. 1А. Cls Clg x=10 For k=1 to 10 circle x,100,10 x=x+25 Pause 0.1 next k x=10 y=150 r=10 h=25 a: circle x,y,r pause 0.1 x=x+h goto a Нарисуйте на экране максимальное число кругов с заданным радиусом х. clg a=30 x=a while x<300-a circle x,x,a x=x+2*a end while Изобразите на экране расходящиеся концентрические круги (с эффектом анимации). clg color white rect 0,0,300,300 color red a=5 x=150 while a<150 circle x,x,a pause 0.1 a=a+5 end while Оператор stamp - позволяет задать позицию многоугольника в любом месте экрана и, если необходимо, указать масштабирование и поворот Задания: Построить движущиеся окружности, смещенные по: Оси Y; Главной диагонали экрана; Побочной диагонали экрана Пример CLG COLOR RED FOR X=50 TO 250 STEP 50 CIRCLE X,150,25 NEXT X Построение графиков функций Пример Y=SIN(X) Clg Line 0,150,300,150 Line 150,0,150,300 Color red For x=-3.14 to 3.14 step 0.01 y=sin(x) Plot 150+40*x,150+80*y Next x Построить графики функций: COS(X) TAN(X) X2 X3 |