Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
zaqwerty
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 108
23.05.2014, 19:15     Масштабирование графика функции #1
Здравствуйте. Написал программу, строящую один из трех графиков функции в зависимости от выбора пользователя. Программа работает, графики строятся, но при этом занимают незначительную часть экрана, то есть получаются слишком мелкие. Хотелось бы, чтобы программа автоматически масштабировала график, подгоняя его под размер окна.
Ниже приведен код программы

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");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
23.05.2014, 19:49     Масштабирование графика функции #2
Нужно найти максимум ymax и минимум ymin функции, которая строится.
Масштаб получается равным
C++
1
2
double scale=800./(ymax-ymin);
y=800-(y-ymin)*scale;//пересчет в экранные координаты
zaqwerty
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 108
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 минут
То есть программа работает как прежде, масштаб все-равно не изменяется.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 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);
}
zaqwerty
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 108
24.05.2014, 12:19  [ТС]     Масштабирование графика функции #5
zss, график данной функции представляет из себя кубическую параболу, разве это не значит, что ее экстремумы будут равняться значениям на краях? Хотя, может я и не прав.
Вставил ваш код, увеличение масштаба не происходит, строится новая кривая (возможно как раз из-за неправильно определения значений на краях).
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
24.05.2014, 17:28     Масштабирование графика функции #6
Цитата Сообщение от zaqwerty Посмотреть сообщение
экстремумы будут равняться значениям на краях?
Экстремумы равны значениям на краях только для монотонной функции,
кубическая парабола таковой не является.
Продифференцируем ее. Получим 3ax^2+b=0, x^2=-b/(3a) x=+-sqrt(-b/(3a))
это локальные экстремумы. После их вычисления еще надо проверить, что больше:
они, или значения на краях.

Если все это проделать неохота, то можно значение масштаба вводить вместе с
a,b,c и подобрать подходящее.
zaqwerty
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 108
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), все-равно не работает.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
25.05.2014, 12:37     Масштабирование графика функции #8
Цитата Сообщение от zaqwerty Посмотреть сообщение
получается комплексное число
Если значение отрицательное, то для таких a,b экстремумов нет
и функция действительно монотонная.
zaqwerty
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 108
25.05.2014, 17:18  [ТС]     Масштабирование графика функции #9
zss, не знаете тогда, почему программа может не работать?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
25.05.2014, 17:41     Масштабирование графика функции #10
Рассмотрите для простоты случай a>0 и b>0.
Тогда функция действительно монотонно возрастает
Ymin=f(xmin), ymax=f(xmax).
zaqwerty
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 108
25.05.2014, 21:25  [ТС]     Масштабирование графика функции #11
zss, так и делал, a=1, b=2, c=3.

Добавлено через 11 минут
Быть может проблема в самом коде?
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");
}
zaqwerty
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 108
28.05.2014, 21:27  [ТС]     Масштабирование графика функции #13
zss, действительно, почему не работает программа даже для простенькой функции y=x? Посмотрите, может код определения масштаба как-то неправильно расположен
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2014, 21:40     Масштабирование графика функции
Еще ссылки по теме:

Построение графика функции C++
Автоматической масштабирование графика C++
C++ Вычисление функции на заданном промежутке, и построение графика этой функции

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

Или воспользуйтесь поиском по форуму:
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 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);
Yandex
Объявления
28.05.2014, 21:40     Масштабирование графика функции
Ответ Создать тему
Опции темы

Текущее время: 13:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru