2 * psychlops_math_function.cpp
3 * Psychlops Standard Library (Universal)
5 * Last Modified 2005/10/13 by Kenchi HOSOKAWA
6 * (C) 2005 Kenchi HOSOKAWA, Kazushi MARUYA, Takao SATO
14 #include "psychlops_m_function.h"
25 Wave::WaveExpression_::WaveExpression_() : next_(0) {
27 Wave::WaveExpression_::~WaveExpression_() {
29 void Wave::WaveExpression_::add(Wave &target) {
31 void Wave::WaveExpression_::remove(Wave &target) {
39 //////// CONSTANT ////////
40 CONSTANT::CONSTANT(double val) : value(val) {
42 double CONSTANT::operator ()(double x) const {
45 double CONSTANT::operator ()(Angle a) const {
51 double ZERO::operator ()(double x) const {
54 double ZERO::operator ()(Angle a) const {
60 double ONE::operator ()(double x) const {
63 double ONE::operator ()(Angle a) const {
70 SIN::SIN() : amplitude(0), wavelength(0), phase(0) {
72 SIN::SIN(const SIN &w) {
75 SIN::SIN(double lngth, double amp, Angle phs) : amplitude(amp), wavelength(lngth), phase(phs) {
76 if(wavelength<=0) throw(typeid(*this), "Range Error", "Wave length must be positive number.");
78 SIN & SIN::set(double lngth, double amp, Angle phs) {
82 if(wavelength<=0) throw(typeid(*this), "Range Error", "Wave length must be positive number.");
85 double SIN::operator ()(double x) const {
86 return this->operator()((360*x/wavelength));
88 double SIN::operator ()(Angle a) const {
90 return ::sin(tmp.at_radian()) * amplitude;
94 //////// COS, TAN ////////
96 double COS::operator ()(double x) const {
97 return this->operator()((360*x/wavelength));
99 double COS::operator ()(Angle a) const {
101 return ::cos(tmp.at_radian()) * amplitude;
104 double TAN::operator ()(double x) const {
105 return this->operator()((360*x/wavelength));
107 double TAN::operator ()(Angle a) const {
109 return ::tan(tmp.at_radian()) * amplitude;
113 //////// PULSE ////////
115 PULSE::PULSE(const PULSE &w) {
118 PULSE::PULSE(double lngth, double amp, Angle phs, Angle step_boundary) : amplitude(amp), wavelength(lngth), phase(phs), step_boundary_(step_boundary) {
120 PULSE & PULSE::set(double lngth, double amp, Angle phs, Angle step_boundary) {
124 step_boundary_ = step_boundary;
125 if(wavelength<=0) throw(typeid(*this), "Range Error", "Wave length must be positive number.");
128 double PULSE::operator ()(double x) const {
129 return this->operator()((360*x/wavelength));
131 double PULSE::operator ()(Angle a) const {
132 if(a.clip()<step_boundary_) {
139 MONOMIAL::MONOMIAL(const MONOMIAL &w) {
142 MONOMIAL::MONOMIAL(int dgr, double fct) : degree(dgr), factor(fct) {
144 MONOMIAL & MONOMIAL::set(int dgr, double fct) {
149 double MONOMIAL::operator ()(double x) const {
150 return factor * pow(x, degree);
153 LINEAR::LINEAR(double fct) {
157 LINEAR & LINEAR::set(double fct) {
161 double LINEAR::operator ()(double x) const {
166 } /* <- namespace Waveform */
167 } /* <- namespace Psychlops */