アプリケーションの作成
1.「ファイル->新規作成->アプリケーション」
Form1:メインのウインドウの作成 Valarray1.cpp、Valarray1.h
2.「ファイル->新規作成->ユニット」
クラス SineCurve:計算用の関数の作成 sine.cpp、sine.h
3.Valarray.cppを表示してから、「ファイル->ユニットヘッダーファイルの追加」を用いてsine.hを追加する。
4.計算用クラスファイルを示す。
オブジェクト指向のため、クラスSineCurve内の変数(フィールド)には外部から直接変更できないようにしている。そのために、get関数とset関数を作成し、これらの関数(メソッド)を通して、フィールドを変更できるようにしている。
さらに、各get関数とset関数内で、単位の変換等を行い、クラス内の計算はMKS単位系(SI単位系)で行うようにすること。
Valarrayに関しては、「変数に関して」を参照してください。
// --------------------------------------------------------------------------
// --------------------------------------------------------------------------
sine.hファイル
//---------------------------------------------------------------------------
// --------------------------------------------------------------------------
#ifndef sineH
#define sineH
//---------------------------------------------------------------------------
// 挿入開始
#include <valarray.h>
#include <math.h>
using namespace std;
class SineCurve
{
public:
SineCurve();
~SineCurve();
// Calculation of sine curve
public:
void __fastcall calculationOfSineCurve();
void __fastcall setTime(valarray<double>&);
valarray<double> __fastcall getTime();
void __fastcall setValue(valarray<double>&);
valarray<double> __fastcall getValue();
void __fastcall setNumberOfData(int);
int __fastcall getNumberOfData();
void __fastcall setAmplitude(double);
double __fastcall getAmplitude();
void __fastcall setFrequency(double);
double __fastcall getFrequency();
void __fastcall setPhase(double);
double __fastcall getPhase();
valarray<double>
iTime;
valarray<double>
iValue;
double
iAmplitude;
double
iFrequency;
double
iPhase;
int
iNumberOfData;
};
//---------------------------------------------------------------------------
extern PACKAGE SineCurve C;
//---------------------------------------------------------------------------
// 挿入終了
#endif
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
sine.cppファイル
//---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
// 挿入開始
#include "sine.h"
SineCurve C;
// 挿入終了
//---------------------------------------------------------------------------
#pragma package(smart_init)
// 挿入開始
const double pi=3.141592; // 定数πを定義
SineCurve::SineCurve()
{
}
SineCurve::~SineCurve()
{
}
void __fastcall SineCurve::calculationOfSineCurve()
{
valarray<double>
temp;
temp = 2.0*pi*iFrequency*iTime + iPhase;
iValue = iAmplitude*sin(temp);
return;
}
void __fastcall SineCurve::setTime(valarray<double>&
aTime )
{
iTime.resize(iNumberOfData);
iTime = aTime*1E-3; // ミリ秒を秒に変換して計算する
return;
}
valarray<double> __fastcall SineCurve::getTime()
{
return iTime*1E3; // 秒をミリ秒に変換して返す
}
void __fastcall SineCurve::setValue(valarray<double>&
aValue )
{
iValue.resize(iNumberOfData);
iValue = aValue;
return;
}
valarray<double> __fastcall SineCurve::getValue()
{
return iValue;
}
void __fastcall SineCurve::setNumberOfData(int
aNumberOfData)
{
iNumberOfData = aNumberOfData;
return;
}
int __fastcall SineCurve::getNumberOfData()
{
return iNumberOfData;
}
void __fastcall SineCurve::setAmplitude(double
aAmplitude)
{
iAmplitude = aAmplitude;
return;
}
double __fastcall SineCurve::getAmplitude()
{
return iAmplitude;
}
void __fastcall SineCurve::setFrequency(double
aFrequency)
{
iFrequency = aFrequency;
return;
}
double __fastcall SineCurve::getFrequency()
{
return iFrequency;
}
void __fastcall SineCurve::setPhase(double
aPhase)
{
iPhase = pi*aPhase/180; // 度をラジアンに変換して計算する(180度がπである)
return;
}
double __fastcall SineCurve::getPhase()
{
return (180*iPhase/pi); // ラジアンを度に変換して返す
}
// 挿入終了
5.表示用ファイルを示す。
// -----------------------------------------------------------------------------
// ------------------------------------------------------------------------------
Valarray1.hファイル
// -----------------------------------------------------------------------------
// ------------------------------------------------------------------------------
#ifndef Valarray1H
#define Valarray1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Chart.hpp>
#include <ExtCtrls.hpp>
#include <Series.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:
// IDE 管理のコンポーネント
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TEdit *EditAmplitude;
TEdit *EditFrequency;
TEdit *EditPhase;
TEdit *EditBeginTime;
TEdit *EditEndTime;
TLabel *Label6;
TEdit *EditDeltaTime;
TLabel *Label7;
TLabel *Label8;
TChart *ChartSineCurve;
TFastLineSeries *Series1;
TButton *ButtonCalculation;
TLabel *Label9;
void __fastcall ButtonCalculationClick(TObject
*Sender);
private: // ユーザー宣言
public:
// ユーザー宣言
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
// ---------------------------------------------------------------------------
// ----------------------------------------------------------------------------
Valarray1.cppファイル
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Valarray1.h"
// 挿入開始
#include <valarray.h>
#include "sine.h"
// 挿入終了
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::ButtonCalculationClick(TObject
*Sender)
{
valarray<double>
time;
valarray<double>
value;
int numberOfData;
int i;
C.setAmplitude( EditAmplitude->Text.ToDouble()
);
C.setFrequency( EditFrequency->Text.ToDouble()
);
C.setPhase( EditPhase->Text.ToDouble()
);
numberOfData = (EditEndTime->Text.ToDouble()
- EditBeginTime->Text.ToDouble() )/EditDeltaTime->Text.ToDouble();
C.setNumberOfData(numberOfData);
time.resize(numberOfData);
value.resize(numberOfData);
for(i=0; i<time.size(); i++)
{
time[i] = EditBeginTime->Text.ToDouble()
+ EditDeltaTime->Text.ToDouble()*i;
}
C.setTime( time );
C.calculationOfSineCurve();
value = C.getValue();
ChartSineCurve->Series[0]->Clear();
for(i=0; i<time.size(); i++)
{
ChartSineCurve->Series[0]->AddXY(time[i],
value[i], "", clTeeColor);
}
}
//---------------------------------------------------------------------------