Вернуться наверх
aco.ifmo.ru photonic
вернуться в оглавление предыдущая глава предыдущий параграф следующий параграф следующая глава


Пример 1. Генерация типовых предметов

Комплексная выборка (файлы complex_sample.h, complex_sample.cpp)

complex_sample.h

///////////////////////////////////////////////////////////////////////////////////////////////////
// sample_complex.h
// Двумерная комплексная выборка. Размер выборки по x и y одинаковый.
// 
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// Университет ИТМО
///////////////////////////////////////////////////////////////////////////////////////////////////

#if !defined  SAMPLE_COMPLEX_H
#define SAMPLE_COMPLEX_H

#include "sample.h"
#include <complex>
using namespace std;

#define PI 3.14159265358979
//-------------------------------------------------------------------------------------------------
class SampleComplex: public Sample<complex<double> >
{
public:
    // полный конструктор
    // size - количество элементов, одинаковое по x и y (size*size)
    SampleComplex(int size);
    // деструктор
    virtual ~SampleComplex();

    // вычисление интенсивности выборки (квадрат модуля) 
    // записывается в вещественную часть, мнимая часть обнуляется
    void CalcIntens();

    // вывод в файл только вещественной части выборки
    ostream& PrintReal(ostream& out);
    // вывод в файл только мнимой части выборки
    ostream& PrintImag(ostream& out);

    // вывод в файл модуля выборки
    ostream& PrintModule(ostream& out);
    // вывод в файл фазы выборки
    ostream& PrintPhase(ostream& out);
    // вывод в файл интенсивности выборки (квадрат модуля)
    ostream& PrintIntens(ostream& out);
};
//-------------------------------------------------------------------------------------------------
#endif


sample_complex.cpp

///////////////////////////////////////////////////////////////////////////////////////////////////
// sample_complex.cpp
// Двумерная комплексная выборка. Размер выборки по x и y одинаковый.
// 
// Кафедра Прикладной и компьютерной оптики, http://aco.ifmo.ru
// Университет ИТМО
///////////////////////////////////////////////////////////////////////////////////////////////////

#include "sample_complex.h"
//-------------------------------------------------------------------------------------------------
// полный конструктор
SampleComplex::SampleComplex(int size)
: Sample<complex<double> > (size)
{
}
//-------------------------------------------------------------------------------------------------
// деструктор
SampleComplex::~SampleComplex()
{

}
//-------------------------------------------------------------------------------------------------
// вычисление интенсивности выборки (квадрат модуля) 
// записывается в вещественную часть, мнимая часть обнуляется
void SampleComplex::CalcIntens()
{
    for(int i=0; i<m_size; ++i)
    {							
        for(int j=0; j<m_size; ++j)
        {
            double res=operator()(i,j).real()*operator()(i,j).real() +
                       operator()(i,j).imag()*operator()(i,j).imag();
            operator()(i,j)=complex<double>(res, 0.);
        }
    }
}
//-------------------------------------------------------------------------------------------------
// вывод в файл только вещественной части выборки
ostream& SampleComplex::PrintReal(ostream& out)
{
    for(int i=0;i<m_size;i++)
    {
        for (int j=0; j<m_size; j++)
        {
            out<<operator()(i,j).real()<<" ";
        }
        out<<endl;
    }
    return out;
}
//-------------------------------------------------------------------------------------------------
// вывод в файл только мнимой части выборки
ostream& SampleComplex::PrintImag(ostream& out)
{
    for( int i=0;i<m_size;i++)
    {
        for (int j=0; j<m_size; j++)
        {
            out<<operator()(i,j).imag()<<" ";
        }
        out<<endl;
    }
    return out;
}
//-------------------------------------------------------------------------------------------------
// вывод в файл модуля выборки
ostream& SampleComplex::PrintModule(ostream& out)
{
    complex<double> x;
    for( int i=0;i<m_size;i++)
    {
        for (int j=0; j<m_size; j++)
        {
            double res=sqrt(operator()(i,j).real()*operator()(i,j).real() +
                            operator()(i,j).imag()*operator()(i,j).imag());
            out<<res<<" ";
        }
        out<<endl;
    }
    return out;
}
//-------------------------------------------------------------------------------------------------
// вывод в файл модуля выборки
ostream& SampleComplex::PrintPhase(ostream& out)
{
    complex<double> x;
    for( int i=0;i<m_size;i++)
    {
        for (int j=0; j<m_size; j++)
        {
            double res=atan2(operator()(i,j).imag(), operator()(i,j).real());
            out<<res<<" ";
        }
        out<<endl;
    }
    return out;
}
//-------------------------------------------------------------------------------------------------
// вывод в файл интенсивности выборки (квадрат модуля)
ostream& SampleComplex::PrintIntens(ostream& out)
{
    for( int i=0;i<m_size;i++)
    {
        for (int j=0; j<m_size; j++)
        {
            double res=operator()(i,j).real()*operator()(i,j).real() +
                       operator()(i,j).imag()*operator()(i,j).imag();
            out<<res<<" ";
        }
        out<<endl;
    }
    return out;
}
//-------------------------------------------------------------------------------------------------