Как строить графики в си
Перейти к содержимому

Как строить графики в си

  • автор:

Графика Си. Построение графика функции

Построение графика функции в си
Помогите пожалуйста сделать программу Условие: Разработать программу построения графика заданной.

Построение графика линейной функции
построение графика линейной функции y=kx; k=0.1,0.2,0.3. 1.

Построение графика функции y=sin(x)
есть знатоки кто может помочь ?)) 1. табулированием функции y=sin(x), 2.в одномерном массиве.

Построение графика функции в пределах прямоугольника
Помогите с графиком функции.Проблема в том, что надо его уместить в рамку(я задал ее.

Эксперт Pascal/Delphi

6809 / 4566 / 4819
Регистрация: 05.06.2014
Сообщений: 22,438
Внизу страницы «Похожие темы».
Регистрация: 21.04.2018
Сообщений: 30
не нашел ничего подходящего
Заклинатель змей
611 / 508 / 213
Регистрация: 30.04.2016
Сообщений: 2,412

jpj, графика не входит в стандартную библиотеку С. Выбирайте средства: winAPI, Qt(c++), sfml (c++) и т.д

Неэпический
17849 / 10617 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1

ЦитатаСообщение от DobroAlex Посмотреть сообщение

Есть CSFML
3802 / 2354 / 413
Регистрация: 09.09.2017
Сообщений: 10,208
есть SDL, есть glut
Неэпический
17849 / 10617 / 2049
Регистрация: 27.09.2012
Сообщений: 26,686
Записей в блоге: 1
Есть OpenGL и DirectX
3802 / 2354 / 413
Регистрация: 09.09.2017
Сообщений: 10,208

ЦитатаСообщение от Croessmah Посмотреть сообщение

Есть OpenGL и DirectX

но они не самодостаточные: сначала надо создать окно, потом им подсунуть и только тогда они смогут в нем рисовать.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Построение графика в графическом режиме
Задание: из файла считать данные. И на их основе построить график. Это второе задание. Вычисление.

Графика. Построение вектора попиксельно
Подскажите, пожалуйста, необходимо построить вектор под заданным углом(который можно регулировать.

Консольная Графика — построение графиков функций
Нужно построить в консоле 2 графика функции, друг под другом. Проблема в том что не знаю вобще.

Отрисовка графика функции
Создания графика функции на СИ y=2sin(x)^ Что то не работает помогите найти ошибку.

Построение графика функции на языке C?

Добрый день, подскажите как максимально просто построить график функции средствами языка C?

#include #include int main() < float x, y, z, step; printf("input x:\n"); scanf("%f", &x); printf("Input y:\n"); scanf("%f", &y); printf("input step:\n"); scanf("%f", &step); printf("result:\n"); for(int i = 0; i < 32; i++) < z = (sin(x)+cos(y))/(cos(x)-sin(y))*tan(x*y); printf("%.2f\t %f\n", x, z); x += step; >>

5a9ba82c11315920922107.jpeg

В итоге чтобы получить что то максимально похожее на график из Excel:

  • Вопрос задан более трёх лет назад
  • 5729 просмотров

График функции sin(x)

График функции y=sin(x) симметричен относительно горизонтальной оси, поэтому должен быть построен в окне со смещением относительно левого верхнего угла окна, принятого за начало отсчета.

Смещение осей

Координата X меняется в пределах [0;7] , координата Y — [-1;1] . Величины MAX_X и MAX_Y представляют собой область допустимых значений по осям координат:

Смещение графика функции представляет собой положение первой точки относительно начала отсчета левого верхнего угла:

  • смещение по оси X : OffsetX = minX*width/MAX_X = 0 ;
  • смещение по оси Y : OffsetY = maxY *height/MAX_Y

Значение minX=0 представляет собой минимальное значение координаты x из области допустимых значений.

Значение maxY=1 представляет собой максимальное значение координаты y из области допустимых значений. Рассматривается именно максимальное значение, поскольку за начало отсчета принят левый верхний угол окна, и координата y увеличивается по направлению вниз.

Для того чтобы график функции разместился в окне необходимо рассчитать масштабные коэффициенты по осям. Масштабный коэффициент представляет собой отношение размера окна к области допустимых значений функции.

  • масштабный коэффициент X : ScaleX = width / MAX_X ;
  • масштабный коэффициент Y : ScaleY = height / MAX_Y .

Вычисление координат следующей точки (x;y) графика в окне будет осуществляться по формулам:

  • координата X=OffsetX + x*ScaleX ;
  • координата Y=OffsetY + y*ScaleY ,

где (x;y) — координаты точки, полученные из функции y=sin(x) .

Реализация на C++

#include
#include
const int NUM = 70; // количество точек
LONG WINAPI WndProc( HWND , UINT , WPARAM , LPARAM );
double **x; // массив данных
// Задание исходных данных для графика
// (двумерный массив, может содержать несколько рядов данных)
double ** getData( int n)
double **f;
f = new double *[2];
f[0] = new double [n];
f[1] = new double [n];
for ( int i = 0; i double x = ( double )i * 0.1;
f[0][i] = x;
f[1][i] = sin(x);
>
return f;
>
// Функция рисования графика
void DrawGraph( HDC hdc, RECT rectClient,
double **x, // массив данных
int n, // количество точек
int numrow = 1) // количество рядов данных (по умолчанию 1)
double OffsetY, OffsetX;
double MAX_X, MAX_Y;
double ScaleX, ScaleY;
double min, max;
int height, width;
int X, Y; // координаты в окне (в px)
HPEN hpen;
height = rectClient.bottom — rectClient.top;
width = rectClient.right — rectClient.left;
// Область допустимых значений X
min = x[0][0];
max = x[0][0];
for ( int i = 0; i if (x[0][i] < min) min = x[0][i];
if (x[0][i] > max) max = x[0][i];
>
double temp = max — min;
MAX_X = max — min;
OffsetX = min*width / MAX_X; // смещение X
ScaleX = ( do uble )width / MAX_X; // масштабный коэффициент X
// Область допустимых значений Y
min = x[1][0];
max = x[1][0];
for ( int i = 0; i for ( int j = 1; j if (x[j][i] < min) min = x[j][i];
if (x[j][i] > max) max = x[j][i];
>
>
MAX_Y = max — min;
OffsetY = max*height / (MAX_Y); // смещение Y
ScaleY = ( double )height / MAX_Y; // масштабный коэффициент Y
// Отрисовка осей координат
hpen = CreatePen(PS_SOLID, 0, 0); // черное перо 1px
SelectObject(hdc, hpen);
MoveToEx(hdc, 0, OffsetY, 0); // перемещение в точку (0;OffsetY)
LineTo(hdc, width, OffsetY); // рисование горизонтальной оси
MoveToEx(hdc, OffsetX, 0, 0); // перемещение в точку (OffsetX;0)
LineTo(hdc, OffsetX, height); // рисование вертикальной оси (не видна)
DeleteObject(hpen); // удаление черного пера
// Отрисовка графика функции
int color = 0xFF; // красное перо для первого ряда данных
for ( int j = 1; j hpen = CreatePen(PS_SOLID, 2, color); // формирование пера 2px
SelectObject(hdc, hpen);
X = ( int )(OffsetX + x[0][0] * ScaleX); // начальная точка графика
Y = ( int )(OffsetY — x[j][0] * ScaleY);
MoveToEx(hdc, X, Y, 0); // перемещение в начальную точку
for ( int i = 0; i X = OffsetX + x[0][i] * ScaleX;
Y = OffsetY — x[j][i] * ScaleY;
LineTo(hdc, X, Y);
>
color = color DeleteObject(hpen); // удаление текущего пера
>
>
// Главная функция
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
HWND hwnd;
MSG msg;
WNDCLASS w;
x = getData(NUM); // задание исходны данных
memset(&w, 0, sizeof ( WNDCLASS ));
w.style = CS_HREDRAW | CS_VREDRAW ;
w.lpfnWndProc = WndProc;
w.hInstance = hInstance;
w.hbrBackground = CreateSolidBrush(0x00FFFFFF);
w.lpszClassName = «My Class» ;
RegisterClass(&w);
hwnd = CreateWindow( «My Class» , «График функции» ,
WS_OVERLAPPEDWINDOW ,
500, 300, 500, 380, NULL, NULL,
hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
TranslateMessage(&msg);
DispatchMessage(&msg);
>
return msg.wParam;
>
// Оконная функция
LONG WINAPI WndProc( HWND hwnd, UINT Message,
WPARAM wparam, LPARAM lparam)
HDC hdc;
PAINTSTRUCT ps;
switch (Message)
case WM_PAINT :
hdc = BeginPaint(hwnd, &ps);
DrawGraph(hdc, ps.rcPaint, x, NUM); // построение графика
// Вывод текста y=sin(x)
SetTextColor(hdc, 0x00FF0000); // синий цвет букв
TextOut(hdc, 10, 20, «y=sin(x)» , 8);
EndPaint(hwnd, &ps);
break ;
case WM_DESTROY :
PostQuitMessage(0);
break ;
default:
return DefWindowProc(hwnd, Message, wparam, lparam);
>
return 0;
>

График функции sin(x)

Результат выполнения

Примечание : Для корректной сборки приложения используется многобайтовая кодировка.

Комментариев к записи: 13

Программа на си для построения графика функции

В этой статье мы разберем программу на языке программирования си для построения графиков функций. В нашей программе будут отражаться система координат с делениями и подписями на них и будут строиться графики двух функций, который может сам задать пользователь.
В программе на си для построения графика функции вводятся следующие константы
X0 , Y0 — координаты центра координат
k – масштаб одного деления на осях (сколько пикселов в одном делении)
Опишем все функции и процедуры используемые в программе для построения графиков функций
Подробно о задании функций и процедур в си
int osx (float x) переводит реальную координату на оси ox в координату экрана
int osy (float y) переводит реальную координату на оси oy в координату экрана
float F1 ( float x ) и float F2 ( float x ) задают функции , графики которых мы будем строить
void Point ( float x, float y, int color ) рисует точку графика функции на экране
Перед построением графиков функций необходимо построить систему координат. Для построения системы координат используется процедура
void Axes()
В этой процедуре в цикле for рисуются линии меток делений на равном расстоянии друг от друга, который определяется масштабом одного деления k и выводятся значения делений с помощью двух операторов
sprintf ( s, «%d», i ); // записываем в строковую переменную число деления
outtextxy ( xe-10, Y0+4, s ); // вывод числа
Процедура grafik1() и grafik2() строят графики функций f1 и f2
В этих процедурах в цикле for для всех доступных значений x определяется координата y и точка графика строится с помощью процедуры point()

Пример работы программы построения графиков на си, функции пользователь может менять

графики функций на си

Программа на си для построения графиков функций
#include
#include //графический режим
#include // математические функции

//————————————————
const int X0 = 100, Y0 = 400;// координаты центра координат
const float k = 15;// масштаб в точках одного деления на графике
//——————————————
// перевод y в координаты экрана
//——————————————
int osx (float x)
return X0+k*x;
>
//——————————————
//перевод y в координаты экрана
//——————————————
int osy (float y)
return Y0-k*y;
>
// первая функция
float F1 ( float x )
return sqrt(2*x);
>
// вторая функция
float F2 ( float x )
return x*x/2;
>
// построение осей
void Axes()
int i, xe,ye,y1;
char s[10];
line ( X0, 0, X0, 599 ); // ось ox
line ( 0, Y0, 799, Y0 ); // ось oy
// метки на оси ox
for ( i = 1; i xe = osx ( i );
line ( xe, Y0-2, xe, Y0+2 ); // рисуем деление разметки
sprintf ( s, «%d», i ); // записываем в строковую переменную число деления
outtextxy ( xe-10, Y0+4, s ); // вывод числа
>
// метки на оси oy
for ( i = 1; i ye = osy( i+1 );
line ( X0-2, ye, X0+2, ye ); // рисуем деление
sprintf ( s, «%d»,i ); // записываем в строковую переменную число деления
outtextxy ( X0+10, ye+4, s ); // вывод числа
>
>
// построение точки графика функции
void Point ( float x, float y, int color )
int xe, ye;
xe = osx(x);
ye = osy(y);
if ( xe >= 0 && xe < 800 && ye >= 0 && ye < 600 )
putpixel(xe, ye, color);
>
// построение графика первой функции
void grafik1()
float x, h, xmin, xmax;
h = 1 / k;
xmin = (-X0)/ k;
xmax=(800-X0)/k;
for ( x = xmin; x Point(x, F1(x), WHITE);
>
>
// построение графика второй функции
void grafik2()
float x, h, xmin, xmax;
h = 1 / k;
xmin = (-X0)/ k;
xmax=(800-X0)/k;
for ( x = xmin; x Point(x, F2(x), WHITE);
>
>
// главная программа
main ()
initwindow ( 800, 600 ); // создать окно для графики
Axes(); // построение и разметка осей координат
grafik1(); // строим график первой функции
grafik2(); // строим график второй функции
getch(); // ждать нажатия на клавишу
closegraph(); // закрыть окно для графики
>
Полезно почитать по теме построение графиков функций в программа си
Графика в си
Процедуры и функции в си

Комментарии ( 0 )

Нет комментариев. Ваш будет первым!

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

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