Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Рисование графика ф-ии


Автор: stmamont 7.4.2005, 19:36
Как нарисовать в определенном месте формы график функции.
Знаю что вопрос глупый. И даже предполагаю ответ, что через canvas.
Но как? можно какой нить пример или ссылку где про это можно почитать. Срочно!

Автор: Fixin 7.4.2005, 20:32
Canvas->MoveTo(х, у)
Canvas->LineTo(х, у)

Этим и рисуй.

Автор: Бегемот 7.4.2005, 20:46
Ну вот примерно так.
Код

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
/*==================================================================*/
void __fastcall TForm1::FormPaint(TObject *Sender)
{
    Grafik();
}
/*==============> Пользователь изменил размер окна <================*/
void __fastcall TForm1::FormResize(TObject *Sender)
{
    TRect rct = Rect(0,0,ClientWidth,ClientHeight);

    Canvas->FillRect(rct);
    Grafik();
}
/*==============> Функция, график которой надо построить <==========*/
float f( float x)
{
   return 2*sin(x)*exp(x/5);
}
/*==================================================================*/
void TForm1::Grafik()
{
 float x1, x2;   // границы изменения аргумента функции
 float y1, y2;   // границы изменения значения функции
 float x;        // аргумент функции
 float y;        // значение функции в точке x
 float dx;       // приращение аргумента
 int l,b;        // левый нижний угол области вывода графика
 int w, h;       // ширина и высота области вывода графика
 float mx, my;   // масштаб по осям X и Y
 int x0, y0;     // начало координат

 // область вывода графика
 l = 10;                      // X - координата левого верхнего угла
 b = Form1->ClientHeight-20;  // Y - координата левого нижнего угла
 h = Form1->ClientHeight-40;  // высота
 w = Form1->Width - 20;       // ширина

 x1 = 0;     // нижняя граница диапазона аргумента
 x2 = 25;    // верхняя граница диапазона аргумента
 dx = 0.01;  // шаг аргумента

 // найдём максимальное и минимальное значение функции на отрезке [x1,x2]
 x = x1;
 y1 = f(x); // минимум
 y2 = f(x); // максимум
 do
 {
   y =  f(x);
   if ( y < y1 ) y1 = y;
   if ( y > y2 ) y2 = y;
   x += dx;
 }
 while (x <= x2);

 // вычислим масштаб
 my = (float)h/abs(y2-y1);  // масштаб по оси Y
 mx = w/abs(x2-x1);         // масштаб по оси X

 // оси
 x0 = l+abs(x1*mx);
 y0 = b-abs(y1*my);
 Canvas->MoveTo(x0,b);Canvas->LineTo(x0,b-h);
 Canvas->MoveTo(l,y0);Canvas->LineTo(l+w,y0);
 Canvas->TextOutA(x0+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
 Canvas->TextOutA(x0+5,b,FloatToStrF(y1,ffGeneral,6,3));

 // построение графика
 x = x1;
 do
 {
   y = f(x);
   Canvas->Pixels[x0+x*mx][y0-y*my] = clRed;
   x += dx;
 }
 while (x <= x2);
}

Функция Graphik() сначало вычисляет максимальное(y2) и минимальное(y1) значение функции на отрезке[x1,x2]. Затем вычисляет коэффициенты масштабирования по осям X и Y, используя информацию о ширине и высоте области вывода графика. После чего вычисляет координату Y горизонтальной оси, координату X вертикальной оси и вычерчивает координатные оси. Ну а затем выполняет непосредственное построение графика. Меняя инструкции в теле функции f(x), можно получить график другой функции.
Ну и не забудь(для моего примера)подключить"math.h" для доступа к sin и exp и объявить функцию Grafik() в разделе private объявления формы в заголовочном файле. smile

Автор: vudu91 9.5.2009, 14:32
а почему в меня ошыбка??? 
[C++ Error] Unit1.cpp(38): E2316 'TForm1::Grafik()' is not a member of 'TForm1'


M
dumb
Темы объединены

Автор: Dmi3ev 9.5.2009, 15:13
vudu91, надо в в файле *.h этого юнита объявить свою функцию в public
Код

public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
        void Grafik(); //во это ты должен написать, остальное не трогай (это для понимания, где писать)

Тогда все заработает...

Автор: xvr 12.5.2009, 20:13
Рисуй в TChart

Автор: Dmi3ev 12.5.2009, 20:53
xvr, тема старая, это vudu91 тычется везде... 

Автор: vudu91 14.5.2009, 17:44


 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)