#endif
#ifndef MAX
# define MAX(x,y) ( (x) > (y) ? (x) : (y) )
#ifndef MIN
# define MIN(x,y) ( (x) < (y) ? (x) : (y) )
CFuzzy_ fuzzy;
double *param, x, y=0, kX=1000, _par=0;
int WIDTH, HEIGHT;
byte function=0;
const byte TRIANGLE = 1;
const byte TRAPEZOID = 2;
const byte GAUSSIAN = 3;
const byte GAUSSIAN2 = 4;
const byte SIGMOID = 5;
/////////////////////////////////////////////////////////////////////////////
// CFuzzyDlg dialog
CFuzzyDlg::CFuzzyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFuzzyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFuzzyDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CFuzzyDlg::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFuzzyDlg)
DDX_Control(pDX, IDC_EDITD, par_d);
DDX_Control(pDX, IDC_EDITC, par_c);
DDX_Control(pDX, IDC_EDITB, par_b);
DDX_Control(pDX, IDC_EDITA, par_a);
DDX_Control(pDX, IDC_GRAPHO, m_grapho);
//}}AFX_DATA_MAP
BEGIN_MESSAGE_MAP(CFuzzyDlg, CDialog)
//{{AFX_MSG_MAP(CFuzzyDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_WM_MOUSEMOVE()
ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
ON_BN_CLICKED(IDC_RADIO5, OnRadio5)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CFuzzyDlg message handlers
BOOL CFuzzyDlg::OnInitDialog()
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);// Set big icon
SetIcon(m_hIcon, FALSE);
par_a.SetWindowText("1");
par_b.SetWindowText("3");
par_c.SetWindowText("5");
par_d.SetWindowText("9");
R_Tri=(CButton*)GetDlgItem(IDC_RADIO1);
R_Tra=(CButton*)GetDlgItem(IDC_RADIO2);
R_Ga=(CButton*)GetDlgItem(IDC_RADIO3);
R_Ga2=(CButton*)GetDlgItem(IDC_RADIO4);
R_Sig=(CButton*)GetDlgItem(IDC_RADIO5);
param = new double[3];
WIDTH = 600;
HEIGHT = 400;
// Set small icon
return TRUE; // return TRUE unless you set the focus to a control
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CFuzzyDlg::OnPaint()
CDialog::OnPaint();
Axis();
if (function==GAUSSIAN)
PlotGaussian();
else
if (function==TRIANGLE)
PlotTriangle();
if (function==TRAPEZOID)
PlotTrapezoid();
if (function==GAUSSIAN2)
PlotGaussian2();
if (function==SIGMOID)
PlotSigmoid();
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CFuzzyDlg::OnQueryDragIcon()
return (HCURSOR) m_hIcon;
void CFuzzyDlg::OnButton1()
if (R_Tri->GetState()==1)
} else
if (R_Tra->GetState()==1)
if (R_Ga->GetState()==1)
if (R_Ga2->GetState()==1)
if (R_Sig->GetState()==1)
else AfxMessageBox("Выберите тип функции!!", MB_ICONWARNING|MB_OK, 0);
void CFuzzyDlg::OnMouseMove(UINT nFlags, CPoint point)
if (point.x>10 && point.x<WIDTH && point.y>10 && point.y<HEIGHT)
font->CreateFont(14, 10, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CDialog::OnMouseMove(nFlags, point);
void CFuzzyDlg::OnRadio1()
par_d.EnableWindow(false);
void CFuzzyDlg::OnRadio2()
par_c.EnableWindow(true);
par_d.EnableWindow(true);
void CFuzzyDlg::OnRadio3()
par_c.EnableWindow(false);
void CFuzzyDlg::OnRadio4()
void CFuzzyDlg::OnRadio5()
void CFuzzyDlg::Axis()
CDC *_dc = m_grapho.GetDC();
CPen DotPen;
DotPen.CreatePen(PS_DOT,1,RGB(0,0,0));
CPen SolidPen;
SolidPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
CBrush brush;
brush.CreateSolidBrush(RGB(255,255,255));
_dc->SelectObject(brush);
_dc->Rectangle(0,0,WIDTH, HEIGHT);
_dc->SelectObject(SolidPen);
_dc->MoveTo(25,10);
_dc->LineTo(25, HEIGHT-40);
_dc->MoveTo(20,HEIGHT-40);
_dc->LineTo(WIDTH-20, HEIGHT-40);
_dc->SelectObject(DotPen);;
CFont *font = new CFont();
font->CreateFont(12, 7, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Courier");
_dc->SelectObject(font);
_dc->TextOut(1,360-5,CString(" 0"));
for (int q=1;q<=10;q++)
_dc->MoveTo(20,360-q*32);
_dc->LineTo(580,360-q*32);
char iY[5];
gcvt(q*0.1,2,iY);
(q!=10)?_dc->TextOut(1,360-q*32-5,iY,3):_dc->TextOut(1,360-q*32-5,CString(" 1"));
_dc->TextOut(580,360,"x");
void CFuzzyDlg::PlotTriangle()
function=TRIANGLE;
CDC *dc = m_grapho.GetDC();
double tmp;
CString par_tmp;
par_a.GetWindowText(par_tmp);
param[0]=atof(par_tmp);
par_b.GetWindowText(par_tmp);
param[1]=atof(par_tmp);
par_c.GetWindowText(par_tmp);
param[2]=atof(par_tmp);
kX = 520000/ABS(param[2]-param[0]);
_par=param[0];
for (x=param[0];x<param[2];x+=ABS(param[2]-param[0])/8000)
tmp = fuzzy.fisTriangleMf(x,param);
tmp*=320;
dc->SetPixel((int)(((x)-param[0])*kX/1000+25),HEIGHT-40-(int)tmp, RGB(255,100,120));
dc->Rectangle((int)((param[0]-param[0])*kX/1000+25-4),HEIGHT-40-0*320-4,
(int)((param[0]-param[0])*kX/1000+25+4),HEIGHT-40-0*320+4);
dc->Rectangle((int)((param[1]-param[0])*kX/1000+25-4),HEIGHT-40-1*320-4,
(int)((param[1]-param[0])*kX/1000+25+4),HEIGHT-40-1*320+4);
dc->Rectangle((int)((param[2]-param[0])*kX/1000+25-4),HEIGHT-40-0*320-4,
(int)((param[2]-param[0])*kX/1000+25+4),HEIGHT-40-0*320+4);
void CFuzzyDlg::PlotTrapezoid()
function=TRAPEZOID;
par_d.GetWindowText(par_tmp);
param[3]=atof(par_tmp);
kX = 520000/ABS(param[3]-param[0]);
for (x=param[0];x<param[3];x+=ABS(param[3]-param[0])/8000)
tmp = fuzzy.fisTrapezoidMf(x,param);
dc->SetPixel((int)(((x-param[0]))*kX/1000+25),HEIGHT-40-(int)tmp, RGB(255,100,100));
dc->Rectangle((int)((param[2]-param[0])*kX/1000+25-4),HEIGHT-40-1*320-4,
(int)((param[2]-param[0])*kX/1000+25+4),HEIGHT-40-1*320+4);
dc->Rectangle((int)((param[3]-param[0])*kX/1000+25-4),HEIGHT-40-0*320-4,
(int)((param[3]-param[0])*kX/1000+25+4),HEIGHT-40-0*320+4);
void CFuzzyDlg::PlotGaussian()
function=GAUSSIAN;
double _0=param[1];
do
tmp = fuzzy.fisGaussianMf(_0,param);
_0-=ABS(param[1])/1000;
while (tmp>=0.001);
kX = 520000/(2*ABS(param[1]-_0));
_par = _0;
for (x=_0;x<(param[1]+ABS(param[1]-_0));x+=ABS((param[1]+ABS(param[1]-_0))-_0)/8000)
tmp = fuzzy.fisGaussianMf(x,param);
dc->SetPixel((int)(((x)-_0)*kX/1000+25),HEIGHT-40-(int)tmp, RGB(255,100,100));
dc->Rectangle((int)((param[1]-_0)*kX/1000+25-4),HEIGHT-40-1*320-4,
(int)((param[1]-_0)*kX/1000+25+4),HEIGHT-40-1*320+4);
void CFuzzyDlg::PlotGaussian2()
function=GAUSSIAN2;
double _0=MIN(param[1], param[3]);
tmp = fuzzy.fisGaussian2Mf(_0,param);
_0-=ABS(MIN(param[1], param[3]))/10000;
kX = 520000/(ABS(MAX(param[1], param[3])-_0));
for (x=_0;x<=MAX(param[1], param[3]);x+=ABS((MAX(param[1], param[3])-_0))/10000)
tmp = fuzzy.fisGaussian2Mf(x,param);
dc->Rectangle((int)((MAX(param[1], param[3])-_0)*kX/1000+25-4),HEIGHT-40-1*320-4,
(int)((MAX(param[1], param[3])-_0)*kX/1000+25+4),HEIGHT-40-1*320+4);
void CFuzzyDlg::PlotSigmoid()
function=SIGMOID;
double _0=param[1],_1=param[1];
tmp = fuzzy.fisSigmoidMf(_0,param);
_0-=param[1]*0.0001;
while (tmp>=0.0001);
tmp = fuzzy.fisSigmoidMf(_1,param);
_1+=param[1]*0.0001;
while(tmp<0.99999);
kX = 520000/(ABS(_1-_0));
for (x=_0;x<=_1;x+=ABS(param[1]*0.0001))
tmp = fuzzy.fisSigmoidMf(x,param);
dc->Rectangle((int)((param[1]-_0)*kX/1000+25-4),(int)(HEIGHT-40-0.5*320-4),(int)((param[1]-_0)*kX/1000+25+4),(int)(HEIGHT-40-0.5*320+4));
Страницы: 1, 2, 3, 4, 5