Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба 1 и 2 СРВ.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
733 Кб
Скачать
☆

Void cLaba1Dlg::DoDataExchange(cDataExchange* pDx)

{

CDialog::DoDataExchange(pDX);

DDX_Text(pDX, IDC_EDIT_COUNT, m_nCount);

DDX_Control(pDX, IDC_LIST_FUNCTIONS, m_FuncList);

DDX_Control(pDX, IDC_SPIN_COUNT, m_Spin);

DDX_Control(pDX, IDC_LIST_POINTS, m_PointList);

DDX_Text(pDX, IDC_EDIT_STEP, m_fStep);

DDX_Text(pDX, IDC_EDIT_LOW, m_fLow);

DDX_Text(pDX, IDC_EDIT_HIGH, m_fHigh);

DDX_Text(pDX, IDC_EDIT_DEV, m_fDev);

DDX_Control(pDX, IDC_SPIN_SPEED, m_SpinSpeed);

DDX_Text(pDX, IDC_EDIT_SPEED, m_nSpeed);

}

BOOL CLaba1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

chart1.CreateInContainer(GetDlgItem(IDC_STATIC_SIGNAL), "Чистый сигнал");

chart1.SetInterpolationType(Chart::CChart::itCurve);

chart2.CreateInContainer(GetDlgItem(IDC_STATIC_NOISE), "Шум");

chart2.SetInterpolationType(Chart::CChart::itLine);

m_Spin.SetRange(20, 5000);

m_SpinSpeed.SetRange(50, 2000);

m_nCount = 2000;

m_fStep = 0.01;

m_nSpeed = 500;

m_PointList.SetExtendedStyle(LVS_EX_GRIDLINES);

m_PointList.InsertColumn(0, "№",LVCFMT_LEFT, 35);

m_PointList.InsertColumn(1, "X",LVCFMT_LEFT, 40);

m_PointList.InsertColumn(2, "Y",LVCFMT_LEFT, 40);

m_FuncList.AddString("sin(x)");

m_FuncList.AddString("sin(x)+0.5*cos(x)");

m_fLow = -1;

m_fHigh = 1;

m_fDev = 1;

UpdateData(FALSE);

init = true;

return TRUE; // return TRUE unless you set the focus to a control

}

Void cLaba1Dlg::OnPaint()

{

If (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

HCURSOR CLaba1Dlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

using namespace Chart;

/*

void CLaba1Dlg::OnBnClickedButtonSetfunc()

{

CSetFuncDlg dlg;

dlg.DoModal();

chart1.GetSeriesList()->DeleteAll();

CSeries* pSer = new CSeries(dlg.m_arrX.GetData(), dlg.m_arrY.GetData(), dlg.m_nCount);

chart1.m_grid.SetDelta(SizeF(dlg.m_fDeltaX,dlg.m_fDeltaX));

chart1.GetSeriesList()->Add(pSer);

}

void CLaba1Dlg::OnBnClickedButtonSetnoise()

{

CNoiseDlg dlg;

dlg.DoModal();

chart2.GetSeriesList()->DeleteAll();

CSeries* pSer = new CSeries(dlg.m_arrX.GetData(), dlg.m_arrY.GetData(), theApp.count);

//chart2.m_grid.SetDelta(SizeF(dlg.m_fDeltaX,dlg.m_fDeltaX));

chart2.GetSeriesList()->Add(pSer);

}

*/

void CLaba1Dlg::OnLbnSelchangeListFunctions()

{

if(init) MakePureSignal();

}

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

inline float uniform(float lo, float hi)

{

return rand()/(float)RAND_MAX * (hi-lo) + lo;

}

float normal(float lo, float hi, float Sigma, float MathExp = 0.0f)

{

float Sum = 0.0f, R;

for(int i = 0; i<12; i++)

Sum+=uniform(0,1);

R = ((Sum - 6)*Sigma+MathExp);

return R;

}

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

void CLaba1Dlg::MakePureSignal()

{

CString str;

UpdateData();

m_pureSignal.RemoveAll();

m_pureSignal.SetSize(m_nCount);

int i;

switch(m_FuncList.GetCurSel())

{

case 0://"sin(x)"

for(i=0;i<m_nCount;i++)

{

m_pureSignal[i].Y = sin(m_pureSignal[i].X=i*m_fStep);

}

break;

case 1://"sin(x)+0.5*cos(x)"

for(i=0;i<m_nCount;i++)

{

m_pureSignal[i].X = i*m_fStep;

m_pureSignal[i].Y = sin(m_pureSignal[i].X)+0.5*cos(m_pureSignal[i].X);

}

}

for(i=0;i<m_nCount;i++)

{

str.Format("%d",i);

m_PointList.InsertItem(i, str);

str.Format("%3.3f", m_pureSignal[i].X);

m_PointList.SetItemText(i,1, str);

str.Format("%3.3f", m_pureSignal[i].Y);

m_PointList.SetItemText(i,2,str);

}

chart1.GetSeriesList()->DeleteAll();

CSeries* pSer = new CSeries(m_pureSignal.GetData(), m_nCount);

//chart1.m_grid.SetDelta(SizeF(m_fStep,m_fStep));

chart1.GetSeriesList()->Add(pSer);

}

void CLaba1Dlg::OnEnChangeEditCount()

{

if(init) MakePureSignal();

}

void CLaba1Dlg::OnEnChangeEditStep()

{

MakePureSignal();

}

void CLaba1Dlg::MakeNoise(void)

{

int i;

UpdateData();

m_Noise.RemoveAll();

m_Noise.SetSize(m_nCount);

switch(GetCheckedRadioButton(IDC_RADIO_NORMAL, IDC_RADIO_UNIFORM))

{

case IDC_RADIO_UNIFORM:

for(i=0;i<m_nCount;i++)

{

m_Noise[i].X = m_fStep*i;

m_Noise[i].Y = uniform(m_fLow, m_fHigh);

}

break;

case IDC_RADIO_NORMAL:

for(i=0;i<m_nCount;i++)

{

m_Noise[i].X = m_fStep*i;

float r;

/* do

{

r = normal(m_fLow, m_fHigh, m_fDev);

} while(r>m_fHigh||r<m_fLow);*/

r = normal(m_fLow, m_fHigh, m_fDev);

if(r>m_fHigh) r = m_fHigh;

else if(r<m_fLow) r = m_fLow;

else ;

m_Noise[i].Y = r;

}

break;

default: return;

}

chart2.GetSeriesList()->DeleteAll();

CSeries* pSer = new CSeries(m_Noise.GetData(), m_nCount);

chart2.GetSeriesList()->Add(pSer);

}

void CLaba1Dlg::OnBnClickedRadioNormal()

{

MakeNoise();

}

void CLaba1Dlg::OnBnClickedRadioUniform()

{

MakeNoise();

}

void CLaba1Dlg::OnBnClickedButtonMesh()

{

m_jammedSignal.RemoveAll();

m_jammedSignal.SetSize(m_nCount);

for(int i=0;i<m_nCount;i++)

{

m_jammedSignal[i].X = m_pureSignal[i].X;

m_jammedSignal[i].Y = m_pureSignal[i].Y + m_Noise[i].Y;

}

CSeries* pSer = new CSeries(m_jammedSignal.GetData(), m_nCount);

pSer->SetColor(Gdiplus::Color::Red);

chart1.GetSeriesList()->Add(pSer);

not_filtered = true;

}

void CLaba1Dlg::OnBnClickedButtonFilter()

{

k=0;

GetDlgItem(IDC_BUTTON_FILTER)->EnableWindow(FALSE);

GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);

OnTimer(1);

SetTimer(1, 500, NULL);

}

void CLaba1Dlg::OnBnClickedButtonStop()

{

KillTimer(1);

GetDlgItem(IDC_BUTTON_FILTER)->EnableWindow(TRUE);

GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);

float S=0.f;

for(int i=0;i<m_nCount;i++)

S+=(m_Signal[i].Y - m_pureSignal[i].Y)*(m_Signal[i].Y - m_pureSignal[i].Y);

CString str;

str.Format("Отклонение: %f",S);

AfxMessageBox(str);

}

void CLaba1Dlg::Filter()

{

if(not_filtered)

{

m_Signal.RemoveAll();

m_Signal.SetSize(m_nCount);

//m_Signal.Append(m_jammedSignal);

not_filtered=false;

}

for(int i=1;i<m_nCount;i++)

{

m_Signal[i].X = m_fStep*i;

m_Signal[i].Y = (m_jammedSignal[i-1].Y + m_jammedSignal[i].Y)/2;

}

m_jammedSignal.Copy(m_Signal);

for(int i=m_nCount-1;i>0;i--)

{

m_Signal[i].X = m_fStep*i;

m_Signal[i].Y = (m_jammedSignal[i-1].Y + m_jammedSignal[i].Y)/2;

}

m_jammedSignal.Copy(m_Signal);

/*

m_jammedSignal.Add(PointF(m_nCount*m_fStep, 0));

m_jammedSignal.Add(PointF((m_nCount+1)*m_fStep, 0));

for(int i=0;i<m_nCount;i++)

{

m_Signal[i].X = m_fStep*i;

m_Signal[i].Y = (m_jammedSignal[i].Y + m_jammedSignal[i+1].Y + m_jammedSignal[i+2].Y)/3;

}

m_jammedSignal.Copy(m_Signal);

*/

chart1.GetSeriesList()->DeleteAll();

CSeries* pSer = new CSeries(m_Signal.GetData(), m_nCount);

pSer->SetColor(Gdiplus::Color::Green);

chart1.GetSeriesList()->Add(pSer);

pSer = new CSeries(m_pureSignal.GetData(), m_nCount);

pSer->SetColor(Gdiplus::Color::Black);

chart1.GetSeriesList()->Add(pSer);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]