Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение графиков фукций 
:(
    Опции темы
vudu91
Дата 10.5.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 9.5.2009

Репутация: нет
Всего: нет



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


#include <vcl.h>
#pragma hdrstop

#include "GraphMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Grafik(void)
{
    float x1, x2;
    float y1, y2;
    float x;
    float y;
    float dx;
    int l,b;
    int w, h;
    float mx, my;
    int x0, y0;

    l = 10;
    b = Form1->ClientHeight-20;
    h = Form1->ClientHeight-40;
    w = Form1->Width - 20;

    x1 = 0;
    x2 = 25;
    dx = 0.01;

    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);
    mx = w/abs(x2-x1);

    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);
}
//---------------------------------------------------------------------------
float __fastcall TForm1::f( float x)
{
   return 2*sin(x)*exp(x/5);
}
void __fastcall TForm1::FormResize(TObject *Sender)
{
    TRect rct = Rect(0,0,ClientWidth,ClientHeight);

    Canvas->FillRect(rct);
    Grafik();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
    Grafik();
}




#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <math.h>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    void __fastcall FormResize(TObject *Sender);
    void __fastcall FormPaint(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
public:        // User declarations
    __fastcall TForm1(TComponent* Owner);
    void __fastcall Grafik(void);
    float __fastcall f(float x);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



очень нужно...помогите пожалуйста.
PM MAIL   Вверх
vudu91
Дата 10.5.2009, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 9.5.2009

Репутация: нет
Всего: нет



 smile  smile  smile 
PM MAIL   Вверх
Dmi3ev
Дата 10.5.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

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

произвольно менять? какую пользователь придумает, такая и будет? или менять из нескольких уже существующих?  smile 


--------------------

PM MAIL   Вверх
vudu91
Дата 10.5.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 9.5.2009

Репутация: нет
Всего: нет



ну зараз можно просто чтобы пользователь выбирал из списка, и просто ставил коэфициенты... например а*х^2 где а зпдает пользователь smile 
PM MAIL   Вверх
Dmi3ev
Дата 10.5.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

например а*х^2 где а зпдает пользователь

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
double f1(int x, double a)//вычисления
{
        return (x*x*a);
}
void TForm1::DrawMyF1()//рисуем саму функцию
{
        int a=StrToInt(Edit1->Text);
        int x=0;
        int y=0;
        this->Canvas->MoveTo(this->Width/2, this->Height/2);
        this->Canvas->Pen->Color=clRed;

        while (x>-(this->Width/2) && y<this->Height/2)
        {
                x--;
                y=f1(x, a);
                this->Canvas->LineTo(x+(this->Width/2), (this->Height/2)-y);
        }
        this->Canvas->MoveTo(this->Width/2, this->Height/2);
        x=0;
        y=0;
        while (x<(this->Width/2) && y<this->Height/2)
        {
                x++;
                y=f1(x, a);
                this->Canvas->LineTo(x+(this->Width/2), (this->Height/2)-y);
        }


}
void TForm1::Draw1()//оси рисуем
{
        this->Canvas->MoveTo(0, this->Height/2);
        this->Canvas->Pen->Color=clBlack;
        this->Canvas->LineTo(this->Width, this->Height/2);
        this->Canvas->MoveTo(this->Width/2, 0);
        this->Canvas->LineTo(this->Width/2, this->Height);

}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Draw1();
        DrawMyF1();
}

Н-файл
Код

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TEdit *Edit1;
        TButton *Button1;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
        void DrawMyF1();
        void Draw1();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

что-то вроде, если функций несколько, то можно организовать выбор через радио баттоны, или чекбокс, и в зависимости от выбора рисовать ту или иную...


--------------------

PM MAIL   Вверх
vudu91
Дата 10.5.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 9.5.2009

Репутация: нет
Всего: нет



Dmi3ev,  большое спасибо smile 
а не подскажэш  как увеличить маштаб выводимого графика и отобразить его не на весь экран а у левый половине...???
PM MAIL   Вверх
Dmi3ev
Дата 10.5.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

а у левый половине...??? 

не понял )))


--------------------

PM MAIL   Вверх
vudu91
Дата 10.5.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 9.5.2009

Репутация: нет
Всего: нет



Dmi3ev, ну чтоб выводило не на весь экран а на половину.

Добавлено через 5 минут и 31 секунду
чтобы график занял не весь экран а левую половину ну а справа било свободное место
PM MAIL   Вверх
Dmi3ev
Дата 10.5.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

а не подскажэш  как увеличить маштаб

не подскажу, буду развивать в тебе умение мыслить... это очень легко...
что такое масштаб?
допустим реально у нас круг радиусом 1мм, а мы его изобразили радиусом 1см, чтобы видно было, те увеличили в 10 раз, а что мы для это сделали? правильно умножили... вот и подумай, как это провернуть программно...
ЗЫ
просто пока кроме клавиш ctrl+c, ctrl+v ты ничего не использовал для написания программы (даже в Н-файле строку не мог добавить)  smile 
либо начинай разбираться с этим несложным кодом, либо нех билдер ваще открывать... тут не все так просто как в CS и WarCraft, надо думать, а не только кнопки жать  smile И побольше читай, такие штучки в самых простецких книжках можно найти...

Добавлено через 58 секунд
Цитата

чтобы график занял не весь экран а левую половину ну а справа било свободное место 

думать, думать, и еще раз думать, надо поменять всего лишь несколько цифр!

Добавлено через 2 минуты и 55 секунд
самый простой способ, если ваще не варит котел, взять TImage, сделать его нужного размера и рисовать в нем! Соответственно, заменить this на Image1

Добавлено через 9 минут и 28 секунд
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
double f1(int x, double a)
{
        return (x*x*a);
}
void TForm1::DrawMyF1()
{
        int a=StrToInt(Edit1->Text);
        int x=0;
        int y=0;
        Image1->Canvas->MoveTo(Image1->Width/2, Image1->Height/2);
        Image1->Canvas->Pen->Color=clRed;

        while (x>-(Image1->Width/2) && y<Image1->Height/2)
        {
                x--;
                y=f1(x, a);
                Image1->Canvas->LineTo(x+(Image1->Width/2), (Image1->Height/2)-y);
        }
        Image1->Canvas->MoveTo(Image1->Width/2, Image1->Height/2);
        x=0;
        y=0;
        while (x<(Image1->Width/2) && y<Image1->Height/2)
        {
                x++;
                y=f1(x, a);
                Image1->Canvas->LineTo(x+(Image1->Width/2), (Image1->Height/2)-y);
        }


}
void TForm1::Draw1()
{
        Image1->Canvas->MoveTo(0, Image1->Height/2);
        Image1->Canvas->Pen->Color=clBlack;
        Image1->Canvas->LineTo(Image1->Width, Image1->Height/2);
        Image1->Canvas->MoveTo(Image1->Width/2, 0);
        Image1->Canvas->LineTo(Image1->Width/2, Image1->Height);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Draw1();
        DrawMyF1();
}
//---------------------------------------------------------------------------


Добавлено через 10 минут и 16 секунд
просто? да? а сам почему не хочешь думать?
  smile 


--------------------

PM MAIL   Вверх
Dmi3ev
Дата 10.5.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



vudu91, ну чего? получилось? или компонент Image не можешь найти?

Это сообщение отредактировал(а) Dmi3ev - 10.5.2009, 22:46


--------------------

PM MAIL   Вверх
vudu91
Дата 10.5.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 9.5.2009

Репутация: нет
Всего: нет



спасибо большое 
буду исправляться... с этим графиком я уже неделю мучаюсь, а толку ноль... 
PM MAIL   Вверх
Dmi3ev
Дата 10.5.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Я бы так сделал, это дает ряд плюсов, не зависит от формы, те можно его разместить где угодно, менять размер, и тд и тп, при этом код не изменится, а с формой придется править каждый раз... Короче, рисуй не на форме а на TImage
Цитата

если ваще не варит котел

это я не со зла, извини... Даже лучше взять TImage


--------------------

PM MAIL   Вверх
vudu91
Дата 10.5.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 9.5.2009

Репутация: нет
Всего: нет



нашол..  я нуб но не на столько, книги немного читаю...
ещо раз спасибо
PM MAIL   Вверх
vudu91
Дата 11.5.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 9.5.2009

Репутация: нет
Всего: нет



а не посоветуешь что нужно сделать,  или что я не правильно делаю я в место всех х++ и х-- просто поставил
Код

 float dx=0.5;
          x=x-dx;
  ну оно почемуто не работает ... вместо dx ставил просто числа  неработает... сама прога запускается ну когда нажымаю "построить график" глюкает..  ни на что не реагирует большэ ... это в мене камп глюкае или гдето я прощитался 
PM MAIL   Вверх
Dmi3ev
Дата 11.5.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 16
Всего: 41



Цитата

float dx=0.5;
          x=x-dx;

а зачем ты так делаешь?

Добавлено через 1 минуту и 6 секунд
Цитата

это в мене камп глюкае или гдето я прощитался  

я тебя расстрою, но не в кампе дело  smile

Добавлено через 1 минуту и 41 секунду
а вот прокладку между стулом и компом можно поменять  smile

Добавлено через 6 минут и 6 секунд
Цитата

x=x-dx;

+ еще подумай, в чем измеряется Width, Height может ли это быть дробным?  smile Прежде чем садиться и писать код, нужно немного почитать... ты даже в готовой программе не можешь ничего изменить, хотя она удобочитабельна и не требует великих знаний, все по полочкам разложено... но не айс... Советую начать читать, так ничего не выйдет... Все зря... Только если будешь брать готовое, тогда будет работать, в остальных случаях нет...


--------------------

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0972 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.