p align="left">CButton *R_Tri, *R_Tra, *R_Ga, *R_Ga2, *R_Sig; CFuzzyDlg(CWnd* pParent = NULL);// standard constructor // Dialog Data //{{AFX_DATA(CFuzzyDlg) enum { IDD = IDD_FUZZY_DIALOG }; CEditpar_d; CEditpar_c; CEditpar_b; CEditpar_a; CStaticm_grapho; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CFuzzyDlg) protected: virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CFuzzyDlg) virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnButton1(); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnRadio1(); afx_msg void OnRadio2(); afx_msg void OnRadio3(); afx_msg void OnRadio4(); afx_msg void OnRadio5(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; // fuzzyDlg.cpp : implementation file // #include "stdafx.h" #include "fuzzy.h" #include "fuzzyDlg.h" #include "fuzzy_.h" #ifndef ABS # define ABS(x) ( (x) > (0) ? (x): (-(x)) ) #endif #ifndef MAX # define MAX(x,y) ( (x) > (y) ? (x) : (y) ) #endif #ifndef MIN # define MIN(x,y) ( (x) < (y) ? (x) : (y) ) #endif 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(); else if (function==TRAPEZOID) PlotTrapezoid(); else if (function==GAUSSIAN2) PlotGaussian2(); else 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() { Axis(); if (R_Tri->GetState()==1) { PlotTriangle(); } else if (R_Tra->GetState()==1) { PlotTrapezoid(); } else if (R_Ga->GetState()==1) { PlotGaussian(); } else if (R_Ga2->GetState()==1) { PlotGaussian2(); } else if (R_Sig->GetState()==1) { PlotSigmoid(); } 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) FF_SWISS, "Courier"); dc->SelectObject(font); dc->TextOut(50,10,"Точка x:"+coords+" Степень принадлежности:"+crds); 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); par_d.EnableWindow(false); } void CFuzzyDlg::OnRadio4() { par_c.EnableWindow(true); par_d.EnableWindow(true); } void CFuzzyDlg::OnRadio5() { par_c.EnableWindow(false); par_d.EnableWindow(false); } 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; 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); par_d.GetWindowText(par_tmp); param[3]=atof(par_tmp); kX = 520000/ABS(param[3]-param[0]); _par=param[0]; for (x=param[0];x<param[3];x+=ABS(param[3]-param[0])/8000) { tmp = fuzzy.fisTrapezoidMf(x,param); tmp*=320; dc->SetPixel((int)(((x-param[0]))*kX/1000+25),HEIGHT-40-(int)tmp, RGB(255,100,100)); } 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-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; 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); par_d.GetWindowText(par_tmp); param[3]=atof(par_tmp); 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); tmp*=320; 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; 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); par_d.GetWindowText(par_tmp); param[3]=atof(par_tmp); double _0=MIN(param[1], param[3]); do { tmp = fuzzy.fisGaussian2Mf(_0,param); _0-=ABS(MIN(param[1], param[3]))/10000; } while (tmp>=0.001); kX = 520000/(ABS(MAX(param[1], param[3])-_0)); _par = _0; for (x=_0;x<=MAX(param[1], param[3]);x+=ABS((MAX(param[1], param[3])-_0))/10000) { tmp = fuzzy.fisGaussian2Mf(x,param); tmp*=320; dc->SetPixel((int)(((x)-_0)*kX/1000+25),HEIGHT-40-(int)tmp, RGB(255,100,100)); } 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; 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); par_d.GetWindowText(par_tmp); param[3]=atof(par_tmp); double _0=param[1],_1=param[1]; do { tmp = fuzzy.fisSigmoidMf(_0,param); _0-=param[1]*0.0001; } while (tmp>=0.0001); do { tmp = fuzzy.fisSigmoidMf(_1,param); _1+=param[1]*0.0001; } while(tmp<0.99999); kX = 520000/(ABS(_1-_0)); _par = _0; for (x=_0;x<=_1;x+=ABS(param[1]*0.0001)) { tmp = fuzzy.fisSigmoidMf(x,param); tmp*=320; 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),(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
|