Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Корректное разбиение осей x,y

7.3K
08 апреля 2007 года
Mandel
21 / / 09.02.2005
Помогите с разбиением оси x и y на части.
У меня почему-то не учитывается на оси x параметры a,b,c,d.
Наприер,
1)для 1-ой параметры a=2,b=8.
2)для 5-ой вообще удас получается (a=2,b=8,c=3,d=4)
3)для 3-ей (параметры a=4,b=8,c=5).
График-то рисует правильно,только размечивает x,y как-то странно:
Вот код:
Код:
const float eps=0.001;
        float func1(float x,float a,float b,float c,float d)
        {
          if (x<=a) return 0;
          if ((a<=x)&&(x<=(a+b)/2)) return 2*(x-a)*(x-a)/((b-a)*(b-a));
          if ((x>=((a+b)/2))&&(x<=b)) return 1-2*(x-b)*(x-b)/((b-a)*(b-a));
          if (x>=b) return 1;
        }
        float func2(float x,float a,float b,float c,float d=0)
        {
          if ((a<=x)&&(x<=b)) return func1(x,a,b,0,0);
          if ((x>=b)&&(x<=c)) return 1;
          if ((x>=c)&&(x<=c+b-a)) return 1-func1(x,c,c+b-a,0,0);else return 0;
        }
        float func3(float x,float a,float b,float c,float d=0)
        {
          if (x<=a) return 0;
          if ((a<=x)&&(x<=c)) return (x-a)/(c-a);
          if ((c<=x)&&(x<=b)) return (b-x)/(b-c);
          if (x>=b) return 0;
        }
        float func4(float x,float a,float b,float c,float d=0)
        {
          if (x<=c) return 1;
          if (1/(1+Power(a*(x-c),b))<eps) return 0;
          if (x>=c) return Power(1+a*Power((x-c),b),-1);
        }
        float func5(float x,float a,float b,float c,float d)
        {
          if (a>=x) return 0;
          if ((x>=a)&&(x<=c)) return (x-a)/(c-a);
          if ((x>=c)&&(x<=d)) return 1;
          if ((x>=d)&&(x<=b)) return (b-x)/(b-d);
          if (x>=b) return 0;
        }
        float func6(float x,float a,float b,float c=0,float d=0)
        {
          if (x<=a-3*b) return 0;
          if (exp(-(x-a)*(x-a)/(2*b*b))<=eps) return 0;
          if ((x>=a-3*b)&&(x<=a+3*b)) return exp(-(x-a)*(x-a)/(2*b*b));
          if (x>=a+3*b) return 0;
        }
        float func7(float x,float a,float b,float c=0,float d=0)
        {
          if (1/(1+exp(-a*(x-b)))<=eps) return 0;
          return Power(1+exp(-a*(x-b)),-1);
        }
        float func8(float x,float a,float b,float c,float d=0)
        {
          if (x<a) return func6(x,a,b);
          else return func6(x,a,c);
        }
        class Tclass
        {
        void Draw(float (*func)(float,float,float,float,float),float a,float b,float c,float d,float aa,float bb)
        {
            int x_start = 50, y_start = 50;
            int height = -100+Form2->Height;
           int width=-100+Form2->Width;
           Form2->Canvas->Rectangle(x_start, y_start, x_start + width, y_start + height);
            Form2->Canvas->MoveTo(x_start,y_start + height);
           Form2->Canvas->Pen->Style=psSolid;
            for(int i = 0; i <= width; i++)
            {
              float x = bb + (aa-bb)*(width - i)/width;
              float y = func(x,a,b,c,d);
              int j = height*y;
              Form2->Canvas->LineTo(x_start + i, y_start + height - j);
            }
            int nn=20;
            float h=(bb-aa)/(float)nn;
            Form2->Canvas->Pen->Style=psDot;
           Form2->Canvas->Pen->Width=1;
            for (int i=0;i<=nn;i++)
            {
              Form2->Canvas->TextOut(40+bb+(aa-bb)*(nn-i*width)/nn,490,FloatToStrF(aa+h*i,0,3,4));
              Form2->Canvas->MoveTo(48+bb+(aa-bb)*(nn-i*width)/nn,50);
              Form2->Canvas->LineTo(48+bb+(aa-bb)*(nn-i*width)/nn,490);
            }
            for (int i=0;i<=nn;i++)
            {
              Form2->Canvas->TextOut(30,40+bb+1.55*(aa-bb)*(nn-i*width*0.5)/nn,FloatToStr((nn-i)/(float)nn));
              Form2->Canvas->MoveTo(50,40+bb+1.55*(aa-bb)*(nn-i*width*0.5)/nn);
              Form2->Canvas->LineTo(650,40+bb+1.55*(aa-bb)*(nn-i*width*0.5)/nn);
            }
       }
public:
        static N;
        int flag;
    Tclass()
    {
        }
        void DrawFunc(int flag,int a,int b,int c=0,int d=0)
        {
          switch(flag)
          {
            case 1:
            {
              Draw(func1,a,b,c,d,a,b);
            }
            break;
            case 2:
            {
              float bb=c+b-a;
              Draw(func2,a,b,c,d,a,bb);
            }
            break;
            case 3:
            {
              Draw(func3,a,b,c,d,a,b);
            }
            break;
            case 4:
            {
              float bb=c+a,aa=c;
              Draw(func4,a,b,c,d,aa,bb);
            }
            break;
            case 5:
            {
              Draw(func5,a,b,c,d,a,b);
            }
            break;
            case 6:
            {
              float bb=a+3*b;
              float aa=a-3*b;
              Draw(func6,a,b,c,d,aa,bb);
            }
            break;
            case 7:
            {
              float bb=a+b;
              float aa=a-b;
              Draw(func7,a,b,c,d,aa,bb);
            }
            break;
            case 8:
            {
            float bb=a+3*c;
            float aa=a-3*b;
            Draw(func8,a,b,c,d,aa,bb);
            }
            break;
          }
          }
};


Вот файл: http://slil.ru/24202092
7.3K
09 апреля 2007 года
Mandel
21 / / 09.02.2005
Я бы мог использовать TChart,но из этого класса я его не вызову ведь ((
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог