Реакция программы на нажатие конкретной клавиши
В следующем фрагменте выходим из цикла по нажатию клавиши Escape
#define ESC 27
while(1){
if(kbhit()){
char c=getch();
if(c == 0)
{
getch();
continue;
}
else if( c == ESC)
break;
}
//работа цикла
}
Организация ввода числовой информации
В графических приложениях ввод текстовой и числовой информации реализуется также в графическом режиме. Для этого нельзя использовать функцию scanf, так как она предполагает текстовый режим.
Предлагается следующий алгоритм для ввода целого положительного числа. Данные считываются с клавиатуры посимвольно, сохраняются в памяти и затем распознаются с помощью функции sscanf форматированного ввода из строки. Строка выводится в графическом режиме посимвольно.
#define ENTER 13
main(){
//инициализация графического режима
char c, buf[2], *str=(char *)malloc(1);
int number;
str[0] = ’\0’;
buf[1] = ‘\0’;
while( (c = getch()) != ENTER){
if( c < ’0’ || c> ’9’)
continue;
buf[0] = c; // введенный символ оформляем в виде строки
outtext(buf); // и выводим на экран в графическом режиме
str = realloc(str, strlen(str) + 2);
str[strlen(str) + 1] = ‘\0’;
str[strlen(str)] = c; // запоминаем символ в памяти
}
sscanf(str, “%d”, &number);
}
Проверка выхода аргумента функции из ОДЗ
Проверку выхода переменной x из области допустимых значений функции f(x) можно реализовать в самом теле функции. В случае выхода из ОДЗ функция взводит глобальный флаг, который проверяется в вызывающей функции.
|
|
Например,
int flag=0; //глобальный флаг
// работаем с функцией y = x1/2
float f(float x){
if(x<0){
flag=1;
return 0;
}
else{
flag=0;
return sqrt(x);
}
}
void main(){
float x, y;
scanf(“%f”, &x);
y=f(x);
if(flag==1)
printf(“Выход из ОДЗ. ”);
else
printf(“Нет выхода из ОДЗ. Продолжаем вычисления”);
}
Графическая и математическая системы координат
Для рисования графика функции программисту удобнее использовать математическую систему координат (МСК), расположенную по центру экрана. Графические функции работают в графической системе координат (ГСК).
а б
Рис. 1. Системы координат: а – математическая; б – графическая
Инициализируем переменные.
int maxx = getmaxx(),
maxy = getmaxy(),
px = 30, // количество пикселей в одной математической единице по оси Ох
py = px * ((float)maxx/maxy); // количество пикселей в одной математической единице по оси Оy.
Соответствие между двумя системами координат представлено
ниже
Соответствие между МСК и ГСК
МСК | ГСК |
(0, 0) ………………………………. | (maxx / 2, maxy / 2) |
(1, 0) ………………………………. | (maxx / 2 + px, maxy / 2) |
(0, 1) ………………………………. | (maxx / 2, maxy / 2 – py) |
(x, y) ….……………………………. | (maxx / 2 + x px, maxy / 2 – y py) |
(x, f(x)) ……………………………. | (maxx / 2 + x px, maxy / 2 – f(x) py) |
|
|
Реализуем масштабирование по оси координат Ох так, чтобы график функции y = f(x) на заданном отрезке [a, b] размещался по всей ширине экрана. Для этого найдем коэффициенты u и v линейного отображения g(x) = u x + v, при котором отрезок [a, b] переходит в отрезок [0, maxx]. Из системы линейных уравнений
u a + v = 0
u b + v = maxx
находим u = maxx / (b-a), v = -a maxx / (b-a). Тогда точке (x, f(x)) будет соответствовать пиксель
( (maxx / (b-a)) * x - a * maxx / (b-a) , maxy / 2 - f(x) * py)),
где px = maxx/(b-a). Затем график можно нарисовать с помощью цикла, в котором счетчик является вещественной математической переменной. Например:
for(float x = a; x <= b; x += (b-a) / maxx)
putpixel((maxx / (b-a)) * x - a * maxx / (b-a), maxy / 2- f(x) * py));
Данный цикл при больших a и b может оказаться бесконечным. Это возможно в случае, если шаг цикла (b-a) / maxx будет меньше расстояния между числом a и его ближайшим соседом справа для типа float.
Использование двух видеостраниц
Для рисования вращающейся звезды (см. задание 3.4) лучше использовать две видеостраницы.
int page=0;
for(double f = 0; f < 2 × M_PI-M_PI / 100; f += M_PI / 50) {
otrisovka(X0, Y0, R1, r2, fi0 + f, COLOR); /* рисуем новую звезду на активной странице, которая по умолчанию имеет нулевой номер*/
|
|
setvisualpage(page); /* показываем изображение новой звезды*/
page=abs(page-1); /* меняем номер страницы с 0 на 1 или наоборот*/
setactivepage(page); /* меняем активную страницу*/
otrisovka(X0, Y0, R1, r2, fi0 + f-M_PI / 50, getbkcolor()); /* стираем старую звезду на активной странице*/
}
Дата добавления: 2019-07-17; просмотров: 193; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!