graphics.h Рисование графика функции

В этой публикации написан код для старого компилятора. В используемых в наши дни он работать не будет. Используемую graphics.h задействовать можно только в Turbo C или Borland C++ 3.1, или в других компиляторах, работающих в старой операционной системе MS-DOS. Так уж вышло, что знакомился с графикой я на одном из этих компиляторов, да и насколько мне известно, иногда (может уже и нет этого) такие компиляторы используют для обучения, хотя время их ушло. Но коли так вышло, то и публикация эта существует.
Чтобы нарисовать график функции, нужно понимать, что он такое есть. Графики функций — это обычно множество точек на плоскости. Поскольку у нас нет технической возможности создавать точку на точке, для нас график функции будет множеством соединённых линиями точек.
Графики функций строятся с помощью формул. В формулу подставляются значения и на основе значений получаются данные, которые выводят в виде графика. Мы для примера возьмём график y = x * x. Множество точек мы получим, когда будем подставлять в x значения. Поскольку экран не предполагает нецелых координат (на распространённых у нас растр, т. е. точка, зерно), то сделаем цикл обхода целых чисел, и каждое целое число будем задействовать в формуле.

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

Теперь следует разобраться с положением оси координат. По умолчанию центр у неё расположен в левом верхнем углу экрана, а мы хотим чтобы он был в привычном нашему глазу положении: в центре экрана. Чтобы сместить ось в центр экрана, нужно центр экрана найти. Для этого мы делим напополам значение X из крайней видной точки справа и делим напополам значение Y из крайней видной точки снизу. Вычислять эти точки нужно строго при инициализированном графическом режиме.

Полученные значения используем, чтобы сместить центр.

Из-за того, что мы привыкли, что ось Y направлена вверх, а на компьютере она направлена вниз, мы делаем корректировку, умножая результат на -1. Это чтобы график при нарастании чисел двигался кверху, а не книзу. Перед началом вытягивания линии — следует точно установить курсор в точку начала отрисовки. Поскольку мы начинаем рисовать не с позиции на нуле по оси X, мы смещаемся немного левее. После правильного позиционирования нам остается только протягивать линию по вычисленным точкам. График получается узковат, но это так у нас располагаются пиксели. Чтобы его расширить, необходимо сделать шире шаг по оси X. Важный момент: неправильно изменять исходные значения вычисленных точек, а то получится, что и зря считали (вдруг те данные нужны для дальнейших вычислений) и даже нарисованный график технически не будет графиком выбранной формулы. Чтобы расширить движение по X, нужно делать цикл с шагом.

14 комментариев на «“graphics.h Рисование графика функции”»

  1. Anonymous:

    Спасибо! пишите дальше

  2. Вова:

    Материал гавно

    22
    2
  3. Аноним:

    😳 😳 😳 ❓ ❓ ❓ ❓

  4. Сергей:

    Чем меньше у нас Х , тем больше точек на линии мы получаим, соответсвенно больше точек = точнее график =)

    • Максим:

      вернее больше точек с координатами (x*50+getmaxx()/2, getmaxy()/2-(y*20)) поместятся на мониторе.

      тут выбрано что в единичном отрезке по Ox помещается 50 пикселей. а шаг по параметру выбран таким образом чтобы для каждого пиксела оси х (0.02*50=1 пиксел) рассчитывался y.

  5. Аноним:

    #include не находит пишет то ошибка что делать ??? 😥

  6. Иван:

    Не работает. Много ошибок.

  7. Иван:

    Вот например, вы обьявили переменную флоат. И передаете ее значение в функцию moveto(), но эта функция может принимать только целые значения. Тоже самое с функцией lineto()

    • Здесь выдается предупреждение, обозначающее возможную потерю данных. Переменная будет преобразована в целочисленную и просто всю дробную часть у нее убьет. Вам надо про преобразования типов читать. (Здесь неявное)

  8. Morose:

    Удобный код. И для Dev-C сгодился (версия  4.9.9.2)

    Позволю себе дать пояснения по коду:

    Помним, нам нужен график функции y=x*x, и в коде выполняется вычисление y=x*x.

    Но при организации рисования графика, вместо lineto(x,y), имеем

    lineto(x*50+getmaxx()/2, getmaxy()/2-(y*20)).

    Что это за «дополнительные элементы»?

    Дело в том, что система координат графического окна строго фиксирована, она соответствует только первой четверти математической декартовой системе. Это значит что на экране, без «дополнительных элементов» мы сможем смотреть только на одну ветвь графика – в положительной части оси ОХ. ( Привычный, математический центр системы декартовых координат на экране размещается в верхнем левом углу графического окна).

    И при этом график будет зеркально отображён вниз – по той причине, что у мониторов считается обратное (по сравнению с математической) направление оси ОУ.

    Итак: чтобы преодолеть технические ограничения «компьютерной системы координат» нужно:

    1) повернуть ось ОУ в обратную сторону (просто умножить У на -1)

    2)сдвинуть центр в середину экрана (прибавить к Х и У половину от ширины и высоты окна)

    3)задать масштаб построения графика (применить коэффициенты умножения для Х и У).

    Вот теперь думаю всё понятно:

    getmaxx() – функция, которая определяет ширину графического окна ,

    getmaxy() – функция, которая определяет высоту графического окна.

    50 – множитель масштаба по оси ОХ,

    20 – множитель масштаба по ОУ.

    А знак минус, перед значением (у*20), ориентирует график на экране в привычном для человека направлении.

    Может автору поста это уже не актуально — но кто-то же ищет подобную инфу.. я же вот искал…

     

     

    8
    2

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/dzhordzh-riz/oblachnye-vychisleniya-2/?lfrom=15589587

Последние комментарии

Яндекс.Метрика