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;
}
}
};
Корректное разбиение осей 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 как-то странно:
Вот код:
Код:
Вот файл: http://slil.ru/24202092
Я бы мог использовать TChart,но из этого класса я его не вызову ведь ((