Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zaqwerty
2 / 2 / 1
Регистрация: 14.12.2013
Сообщений: 113
#1

Масштабирование графика функции - C++

23.05.2014, 19:15. Просмотров 1193. Ответов 13
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <graphics.h>
#include <math.h>
#include <locale>
const int X0=400;
const int Y0=400;
const float xmin=-10;
const float xmax=10;
int main()
{
setlocale(LC_ALL,"Russian");
float b,xmin=-10,xmax=10,h=0.001,a,x,y,c,s,h1;
int l;
printf("Âûáåðèòå ГЈГ°Г*ГґГЁГЄ\n 1) y=a*x*x*x+b*x+c\n 2) y=a*cos(x+b)+c\n 3) y=a*log(fabs(x+b))+c;\n");
scanf("%d",&l);
if(l==1)
{
printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ a=");
scanf("%f",&a);
printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ b=");
scanf("%f",&b);
printf("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ c=");
scanf("%f", &c);
initwindow(800,800);
line (0,X0,799,X0);
line (Y0,0,Y0,799);
 
for (x=xmin;x<=xmax;x+=h)
{
  y=a*x*x*x+b*x+c;
 
 putpixel(x+X0,-y+Y0, 3);
 
}
else
if(l==2)
{
   printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ a=");
scanf("%f",&a);
printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ b=");
scanf("%f",&b);
printf("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ c=");
scanf("%f", &c);
initwindow(800,800);
line (X0,0,X0,799);
line (0,Y0,799,Y0);
 
for (x=xmin;x<=xmax;x+=h)
{
  y=a*cos(x+b)+c;
 
 putpixel(x+X0,-y+Y0, 4);
 
} }
else
if(l==3)
{
   printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ a=");
scanf("%f",&a);
printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ b=");
scanf("%f",&b);
printf("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ c=");
scanf("%f", &c);
initwindow(800,800);
line (X0,0,X0,799);
line (0,Y0,799,Y0);
 
for (x=xmin;x<=xmax;x+=h)
{
  y=a*log(fabs(x+b))+c;
 
 putpixel(x+X0,-y+Y0, 5);
 
} }
else
{printf("Íåîáõîäèìî âûáðГ*ГІГј ГЈГ°Г*ГґГЁГЄ 1, ГЈГ°Г*ГґГЁГЄ 2 èëè ГЈГ°Г*ГґГЁГЄ 3\n");}
system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2014, 19:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Масштабирование графика функции (C++):

Автоматической масштабирование графика - C++
Не могу понять как реализовать масштабирование, чтобы при больших/малых значениях функции происходило автоматическое масштабирование как...

Вычисление функции на заданном промежутке, и построение графика этой функции - C++
Написать блок-схему и программу вычисления функции на за- данном промежутке с шагом 0.2 и построить график этой функции. Если x&gt;1 ...

Построение графика функции - C++
Помогите, пожалуйста, определить условия для построения графика с помощью графического модуля

Построение графика функции f(x) - C++
Необходимо построить график функции y=45x^3-1

Построение графика функции - C++
Помогите, пожалуйста, построить оси координат и график функции f(x) на заданном диапазоне

Построение графика функции - C++
Как визуально построить график функции? sin x +x-3=0 На интервале от a до b. (a,b - любые числа) С точностью e=0.001

13
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
23.05.2014, 19:49 #2
Нужно найти максимум ymax и минимум ymin функции, которая строится.
Масштаб получается равным
C++
1
2
double scale=800./(ymax-ymin);
y=800-(y-ymin)*scale;//пересчет в экранные координаты
1
zaqwerty
2 / 2 / 1
Регистрация: 14.12.2013
Сообщений: 113
24.05.2014, 07:54  [ТС] #3
zss, добавил ваш код в конец первого цикла (построение графика y=a*x*x*x+b*x+c), но программа не работает. Код, который я вставил, представлен ниже:
C++
1
2
3
4
ymin=a*xmin*xmin*xmin+b*xmin+c;
ymax=a*xmax*xmax*xmax+b*xmax+c;
double scale=800./(ymax-ymin);
y=800-(y-ymin)*scale;
Полностью код программы представлен ниже:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <graphics.h>
#include <math.h>
#include <locale>
const int X0=400;
const int Y0=400;
const float xmin=-10;
const float xmax=10;
int main()
{
setlocale(LC_ALL,"Russian");
float b,xmin=-10,xmax=10,h=0.001,a,x,y,c,s,h1,ymin, ymax;
int l;
printf("Âûáåðèòå ГЈГ°Г*ГґГЁГЄ\n 1) y=a*x*x*x+b*x+c\n 2) y=a*cos(x+b)+c\n 3) y=a*log(fabs(x+b))+c;\n");
scanf("%d",&l);
if(l==1)
{
printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ a=");
scanf("%f",&a);
printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ b=");
scanf("%f",&b);
printf("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ c=");
scanf("%f", &c);
initwindow(800,800);
line (0,X0,799,X0);
line (Y0,0,Y0,799);
 
for (x=xmin;x<=xmax;x+=h)
{
  y=a*x*x*x+b*x+c;
 putpixel(x+X0,-y+Y0, 3);
}
ymin=a*xmin*xmin*xmin+b*xmin+c;
ymax=a*xmax*xmax*xmax+b*xmax+c;
double scale=800./(ymax-ymin);
y=800-(y-ymin)*scale;//???????? ? ???????? ??????????
 
else
if(l==2)
{
   printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ a=");
scanf("%f",&a);
printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ b=");
scanf("%f",&b);
printf("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ c=");
scanf("%f", &c);
initwindow(800,800);
line (X0,0,X0,799);
line (0,Y0,799,Y0);
 
for (x=xmin;x<=xmax;x+=h)
{
  y=a*cos(x+b)+c;
 
 putpixel(x+X0,-y+Y0, 4);
 
} }
else
if(l==3)
{
   printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ a=");
scanf("%f",&a);
printf ("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ b=");
scanf("%f",&b);
printf("Ââåäèòå Г§Г*Г*Г·ГҐГ*ГЁГҐ c=");
scanf("%f", &c);
initwindow(800,800);
line (X0,0,X0,799);
line (0,Y0,799,Y0);
 
for (x=xmin;x<=xmax;x+=h)
{
  y=a*log(fabs(x+b))+c;
 
 putpixel(x+X0,-y+Y0, 5);
 
} }
else
{printf("Íåîáõîäèìî âûáðГ*ГІГј ГЈГ°Г*ГґГЁГЄ 1, ГЈГ°Г*ГґГЁГЄ 2 èëè ГЈГ°Г*ГґГЁГЄ 3\n");}
system("pause");
}
Добавлено через 1 час 40 минут
То есть программа работает как прежде, масштаб все-равно не изменяется.
0
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
24.05.2014, 08:55 #4
C++
1
2
3
4
5
6
7
8
9
ymin=a*xmin*xmin*xmin+b*xmin+c;// здесь надо найти Ymin и ymax. Но так неправильно. 
ymax=a*xmax*xmax*xmax+b*xmax+c;// Это не значения на краях, а экстремумы на указанном интервале
double scale=800./(ymax-ymin);
for (x=xmin;x<=xmax;x+=h)
{
      y=a*x*x*x+b*x+c;
      y=800-(y-ymin)*scale;//???????? ? ???????? ??????????
      putpixel(x+X0,-y+Y0, 3);
}
0
zaqwerty
2 / 2 / 1
Регистрация: 14.12.2013
Сообщений: 113
24.05.2014, 12:19  [ТС] #5
zss, график данной функции представляет из себя кубическую параболу, разве это не значит, что ее экстремумы будут равняться значениям на краях? Хотя, может я и не прав.
Вставил ваш код, увеличение масштаба не происходит, строится новая кривая (возможно как раз из-за неправильно определения значений на краях).
0
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
24.05.2014, 17:28 #6
Цитата Сообщение от zaqwerty Посмотреть сообщение
экстремумы будут равняться значениям на краях?
Экстремумы равны значениям на краях только для монотонной функции,
кубическая парабола таковой не является.
Продифференцируем ее. Получим 3ax^2+b=0, x^2=-b/(3a) x=+-sqrt(-b/(3a))
это локальные экстремумы. После их вычисления еще надо проверить, что больше:
они, или значения на краях.

Если все это проделать неохота, то можно значение масштаба вводить вместе с
a,b,c и подобрать подходящее.
1
zaqwerty
2 / 2 / 1
Регистрация: 14.12.2013
Сообщений: 113
25.05.2014, 11:45  [ТС] #7
Если все это проделать неохота, то можно значение масштаба вводить вместе с
a,b,c и подобрать подходящее.
То есть нужно самому вводить значение scale? Но ведь в y=800-(y-ymin)*scale; присутствует ymin, его тоже нужно вводить произвольно?

Добавлено через 32 минуты
zss, высчитал в Math Cad-e ymin и ymax в пределах x=5;6, но программа вообще перестала строить график. Когда я считаю значение y при x=5 и x=6 получается y=138 и y=231 соответственно, но когда я беру значение x=+-sqrt(-b/3a), то в результате получается комплексное число. Я нашел его модуль, получилось что-то около трех, и принял его за ymin. Можно ли было так сделать?
Вот код программы для первого графика:
C++
1
2
3
4
5
6
7
8
9
10
11
12
initwindow(800,800);
line (0,X0,799,X0);
line (Y0,0,Y0,799);
ymax==231;
ymin==3.191;
double scale=800./(ymax-ymin); 
for (x=xmin;x<=xmax;x+=h)
{
  y=a*x*x*x+b*x+c;
y=800-(y-ymin)*scale;
 putpixel(x+X0,-y+Y0, 3);
}
Добавлено через 2 минуты
Подставил только что в качестве ymin следующее: y==3+1.089*sqrt(-1), все-равно не работает.
0
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
25.05.2014, 12:37 #8
Цитата Сообщение от zaqwerty Посмотреть сообщение
получается комплексное число
Если значение отрицательное, то для таких a,b экстремумов нет
и функция действительно монотонная.
2
zaqwerty
2 / 2 / 1
Регистрация: 14.12.2013
Сообщений: 113
25.05.2014, 17:18  [ТС] #9
zss, не знаете тогда, почему программа может не работать?
0
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
25.05.2014, 17:41 #10
Рассмотрите для простоты случай a>0 и b>0.
Тогда функция действительно монотонно возрастает
Ymin=f(xmin), ymax=f(xmax).
0
zaqwerty
2 / 2 / 1
Регистрация: 14.12.2013
Сообщений: 113
25.05.2014, 21:25  [ТС] #11
zss, так и делал, a=1, b=2, c=3.

Добавлено через 11 минут
Быть может проблема в самом коде?
0
Crydok
1 / 1 / 0
Регистрация: 16.12.2013
Сообщений: 27
28.05.2014, 16:53 #12
zss, меня тоже интересует данная тема. Попробовал для простой функции y=x, но не выходит. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <locale>
#include <graphics.h>
int main()
{
 setlocale(LC_ALL,"Russian");
const int X0=400;
const int Y0=400;
float x,y,n1=-30,n2=100,ymin, ymax,sh=0.001;
ymin=n1;
ymax=n2;
double scale=800./(ymax-ymin);
initwindow(800,800);
line (X0,0,X0,799);
line (0,Y0,799,Y0);
for (x=n1;x<=n2;x+=sh)
{
    y=x;
    y=800-(y-ymin)*scale;
putpixel(x+X0,-y+Y0, 3);
 
}
system("pause");
}
1
zaqwerty
2 / 2 / 1
Регистрация: 14.12.2013
Сообщений: 113
28.05.2014, 21:27  [ТС] #13
zss, действительно, почему не работает программа даже для простенькой функции y=x? Посмотрите, может код определения масштаба как-то неправильно расположен
0
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
28.05.2014, 21:40 #14
Цитата Сообщение от Crydok Посмотреть сообщение
y=x;
y=800-(y-ymin)*scale;
putpixel(x+X0,-y+Y0, 3);
У меня нет graphics.h но по логике получается так.
При x=n1 y=800 - (n1-n1)*scale=800
При x=n2 y=800 - (n2-n1)*800/(n2-n1)=0
т.е. получили полное окно от 0 до 800,
соответственно точку надо ставить не в -y+Y0, а в y
C++
1
putpixel(x+X0,y, 3);
0
28.05.2014, 21:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2014, 21:40
Привет! Вот еще темы с ответами:

Построение графика функции в консоли - C++
Привет всем Задание такое - построить график функции |y| = |sin(x)| + cos(x) Вся сложность заключается в том что график должен быть...

Построение графика функции по точкам (Dev-C ) - C++
Подскажите как построить график по точкам(Dev-C++), какая это библиотека и где можно почитать основные команды?

Dev C++ задача на построение графика функции - C++
Недавно начал изучать C++, до этого пытался выучить Си. Следовательно, хочу переделать график ф-ции sin(x) из СИ в C++ по точкам. Вот...

Библиотеки для построения графика функции - C++
Здравствуйте, уважаемые форумчане) Подскажите, пожалуйста, аналог для построение графиков в matlab. Существует ли такая библиотека?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru