Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
1

Построение графика функции (canvas)

04.12.2014, 10:36. Просмотров 1864. Ответов 18
Метки нет (Все метки)

Как построить функцию fabs(sin(x))+fabs(cos(x)) используя метод Canvas? Никак не могу реализовать на C++ builder. Даны такие исходники: диапазон изменения аргумента [0, pi(3.14)], число точек графика n=40. Примерно понимаю, чтобы определить dx(шаг изменений аргумента) нужно формула (pi-0)/n, а дальше полная тьма... Помогите пожалуйста!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2014, 10:36
Ответы с готовыми решениями:

Построение графика функции.
Здравствуйте. Вообщем, суть: Надо нарисовать график функции по формуле y =...

Построение графика функции
Нужно построить график квадратичной функции. С математикой нет проблем....

Построение графика не функции
Здравствуйте. Пишу программу для анализа файлов системного монитора. Загружаю...

Построение графика функции в компоненте TChart
Здраствуйте. Мне нужна помощь в построении графика y=sin(x), а точнее сама...

Построение графика заданной функции на канве
Суть вопроса, не знаю как построить график (без координатной оси), на...

18
SatanaXIII
Почетный модератор
Эксперт С++
5773 / 2773 / 376
Регистрация: 01.11.2011
Сообщений: 6,743
Завершенные тесты: 1
04.12.2014, 11:16 2
Краткое руководство по работе с классом TCanvas для начинающих
0
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
04.12.2014, 11:32  [ТС] 3
SatanaXIII, уже прочитал, там не единого слова про функций, можете порекомендовать литературу по теме?
0
SatanaXIII
Почетный модератор
Эксперт С++
5773 / 2773 / 376
Регистрация: 01.11.2011
Сообщений: 6,743
Завершенные тесты: 1
04.12.2014, 11:45 4
Цитата Сообщение от Tima1996 Посмотреть сообщение
там не единого слова про функций
Само собой. Ведь нельзя же построить функцию. Функцию можно вычислить, там. А построить можно график функции.
По этому пишете программу, вычисляющую значение требуемой функции, показываете код и туда мы уже помогаем вам прикрутить вывод графика.
0
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
04.12.2014, 12:11  [ТС] 5
вот какой у меня код получился:
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
const pi=3.14;
float f(float x)
{
float f=fabs(sin(x))+fabs(cos(x));
return f;
}
void Gragh()
{
float x1,x2,y1,y2,x0,y0;
float x,mx,my;
int height=Form1->Image1->ClientHeight;
int width=Form1->Image1->Width;
float xY=width/2;
float yY=10;
float cY=height-10;
Form1->Image1->Canvas->MoveTo(xY,yY);
Form1->Image1->Canvas->LineTo(xY,cY);
float xX=10;
float yX=height/2;
float cX=width-10;
Form1->Image1->Canvas->MoveTo(xX,yX);
Form1->Image1->Canvas->LineTo(cX,yX);
 
x1=0; x2=pi; y1=f(x1); y2=f(x2);
 
mx=width/(x2-x1); my=height/(y2-y1);
 
x0=xY; y0=yX;
Form1->Image1->Canvas->MoveTo(x0,y0);
 
x=x1;
while(x<x2)
{
Form1->Image1->Canvas->Pixels[x0+mx*x][y0-my*f(x)]=clBlack;
x=x+0.0785;
}
Form1->Image1->Canvas->TextOutA(x0,y0,'0');
Form1->Image1->Canvas->TextOutA(xY,yY,"Y");
Form1->Image1->Canvas->TextOutA(cX,yX,"X");
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Gragh();
}
Добавлено через 1 минуту
0,0785 - это значение, которое я сразу же получил по формуле (pi-0)/n

Добавлено через 1 минуту
график не выходит на экран((
0
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
04.12.2014, 12:29  [ТС] 6
вот какой должен быть у меня график:
Построение графика функции (canvas)
0
gunslinger
случайный прохожий
1305 / 826 / 325
Регистрация: 20.07.2013
Сообщений: 2,318
04.12.2014, 14:42 7
Что за привычка рисовать на Image? Рисуйте уже сразу на форме.
C++
1
2
3
4
5
6
7
8
9
10
11
float f (float x)
{
  return fabs(sin(x))+fabs(cos(x));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  const dx = 40, koefx = 150, koefy = 150;
  for (float x = 0; x <= M_PI; x += M_PI/(dx-1))
    Canvas->Pixels[koefx*(x+.5)][ClientHeight-koefy*f(x)] = clBlack;
}
Оси и т.п. сам нарисуешь / добавишь.

Построение графика функции (canvas)
0
SatanaXIII
Почетный модератор
Эксперт С++
5773 / 2773 / 376
Регистрация: 01.11.2011
Сообщений: 6,743
Завершенные тесты: 1
04.12.2014, 14:59 8
Цитата Сообщение от gunslinger Посмотреть сообщение
Что за привычка рисовать на Image? Рисуйте уже сразу на форме.
Вредные советы? А потом будут возникать вопросы почему, дескать, половина рисунка заползла под панель.
0
gumi250
431 / 398 / 57
Регистрация: 06.02.2012
Сообщений: 1,373
04.12.2014, 15:40 9
Цитата Сообщение от gunslinger Посмотреть сообщение
Что за привычка рисовать на Image? Рисуйте уже сразу на форме.
Каждый раз при пересовке канвы пересчитывать (не перерисовывать, а именно пересчитывать) весь график и перестраивать оси и т.д. это неправильно.
0
gunslinger
случайный прохожий
1305 / 826 / 325
Регистрация: 20.07.2013
Сообщений: 2,318
04.12.2014, 16:03 10
SatanaXIII, если больше ничего на форме нет, то почему бы и не рисовать сразу на канве формы?
gumi250, можно и перерисовывать, не стал заморачиваться (каюсь, грешен).
P.S.: не удержался и кое-что добавил (люблю "графику" со времен рисования линиями в консоли). Сплошные костыли и все такое, но просьба тапками не закидывать.
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
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  const dx = 40, koefx = 150, koefy = 185;
 
  Canvas->Pen->Color = clSilver;
  for (float i = 0; i < 32; i++)
  {
    Canvas->MoveTo(koefx*(i/10+.5), 2*(ClientHeight-koefy*f(0)));
    Canvas->LineTo(koefx*(i/10+.5), 2*(ClientHeight-koefy*f(M_PI/4)-5));
  }
  Canvas->MoveTo(koefx*(0+.5), 2*(ClientHeight-koefy*f(M_PI/4)-5));
  Canvas->LineTo(koefx*(0+.47), 2*(ClientHeight-koefy*f(M_PI/4)-0));
  Canvas->MoveTo(koefx*(0+.5), 2*(ClientHeight-koefy*f(M_PI/4)-5));
  Canvas->LineTo(koefx*(0+.53), 2*(ClientHeight-koefy*f(M_PI/4)-0));
  Canvas->TextOutW(koefx*(0+.45), 2*(ClientHeight-koefy*f(M_PI/4)-12), 'Y');
  Canvas->TextOutW(koefx*(0+.33), 2*(ClientHeight-koefy*f(0)-3.5), "1.00");
 
  for (float i = 0; i < 22; i++)
  {
    Canvas->MoveTo(koefx*(0+.5), 2*(ClientHeight-koefy*f(0)-i*3.75));
    Canvas->LineTo(koefx*(M_PI+.55), 2*(ClientHeight-koefy*f(0)-i*3.75));
  }
  Canvas->MoveTo(koefx*(M_PI+.55), 2*(ClientHeight-koefy*f(0)));
  Canvas->LineTo(koefx*(M_PI+.48), 2*(ClientHeight-koefy*f(0)-2));
  Canvas->MoveTo(koefx*(M_PI+.55), 2*(ClientHeight-koefy*f(0)));
  Canvas->LineTo(koefx*(M_PI+.48), 2*(ClientHeight-koefy*f(0)+2));
  Canvas->TextOutW(koefx*(M_PI+.62), 2*(ClientHeight-koefy*f(0)), 'X');
  Canvas->TextOutW(koefx*(0+.45), 2*(ClientHeight-koefy*f(0)+2), "0.0");
 
  for (float x = 0; x <= M_PI+.01; x += M_PI/(dx-1))
    Canvas->Pixels[koefx*(x+.5)][2*(ClientHeight-koefy*f(x))] = clBlack;
 
}
Построение графика функции (canvas)
0
gumi250
431 / 398 / 57
Регистрация: 06.02.2012
Сообщений: 1,373
04.12.2014, 16:16 11
Цитата Сообщение от gunslinger Посмотреть сообщение
gumi250, можно и перерисовывать, не стал заморачиваться (каюсь, грешен).
Так в этом и причина рисования в Image - не надо замарачиваться перерисовкой. А для отрисовки как вы на канву форму, нужно замарачиваться перерисовкой. gunslinger, вы определитесь, а то и на канву и не перерисовывать.
0
gunslinger
случайный прохожий
1305 / 826 / 325
Регистрация: 20.07.2013
Сообщений: 2,318
04.12.2014, 16:24 12
Я имел в виду не пересчитывать.
Да кому как удобнее. Для примера мне проще без Image. На Image "сложнее стирать" (хотя здесь это не требуется).
Я код выкладываю не для копирования (хотя кому он нужен), а чтобы показать суть, что означает - считайте его псевдокодом, а не точной инструкцией по применению (думал, это понятно, но, видимо, только для меня).
Способ реализации пусть каждый выбирает сам.
0
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
04.12.2014, 17:43  [ТС] 13
так в чем ошибка моя? кто-нибудь ответьте плиз(
0
BRcr
4016 / 2306 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
04.12.2014, 20:08 14
Цитата Сообщение от Tima1996 Посмотреть сообщение
так в чем ошибка моя?
А как насчет экстраполировать ответ из кода gunslinger? Ну, там, взять его код и применить к канве Image1?
0
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
04.12.2014, 22:02  [ТС] 15
BRcr, его код я совсем не понял, не то чтобы экстраполировать его)
0
gumi250
431 / 398 / 57
Регистрация: 06.02.2012
Сообщений: 1,373
04.12.2014, 23:54 16
Так масштаб считать не верно
C++
1
2
y1=f(x1); y2=f(x2);
my=height/(y2-y1);
0
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
04.12.2014, 23:55  [ТС] 17
gumi250, а как надо, не подскажете?
0
gumi250
431 / 398 / 57
Регистрация: 06.02.2012
Сообщений: 1,373
05.12.2014, 00:06 18
Цитата Сообщение от Tima1996 Посмотреть сообщение
gumi250, а как надо, не подскажете?
Ну а самому подумать? Для масштаба нужен максимальный и минимальный Y который можно встреть в графике. Что из y2 и y1 считается максимумом и минимумом?
0
Tima1996
0 / 0 / 1
Регистрация: 03.10.2014
Сообщений: 111
05.12.2014, 00:38  [ТС] 19
gumi250, извините, не понимаю логическую цепочку ваших мыслей
0
05.12.2014, 00:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2014, 00:38

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

Построение графика функции при нажатии кнопки (OnButtonClick)
Здравствуйте ТОВАРИЩИ ФОРУМЧАНИ. Хочу обратиться к Вам как к профессионалам в...

Canvas: масштабирование объектов (графика в C++)
В программе требуется сделать сделать систему координат в компоненте Image,а...


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

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

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