OSDN Git Service

first
[psychlops/cpp.git] / psychlops / core / math / psychlops_m_function.cpp
1 /*
2  *  psychlops_math_function.cpp
3  *  Psychlops Standard Library (Universal)
4  *
5  *  Last Modified 2005/10/13 by Kenchi HOSOKAWA
6  *  (C) 2005 Kenchi HOSOKAWA, Kazushi MARUYA, Takao SATO
7  */
8
9
10
11 #include <Math.h>
12 #include <typeinfo>
13
14 #include "psychlops_m_function.h"
15
16 namespace Psychlops {
17
18
19
20 Wave::Wave() {
21 }
22 Wave::~Wave() {
23 }
24
25 Wave::WaveExpression_::WaveExpression_() : next_(0) {
26 }
27 Wave::WaveExpression_::~WaveExpression_() {
28 }
29 void Wave::WaveExpression_::add(Wave &target) {
30 }
31 void Wave::WaveExpression_::remove(Wave &target) {
32 }
33
34
35
36
37 namespace Waveform {
38
39         ////////        CONSTANT        ////////
40         CONSTANT::CONSTANT(double val) : value(val) {
41         }
42         double CONSTANT::operator ()(double x) const {
43                 return value;
44         }
45         double CONSTANT::operator ()(Angle a) const {
46                 return value;
47         }
48
49         ZERO::ZERO() {
50         }
51         double ZERO::operator ()(double x) const {
52                 return 0.0;
53         }
54         double ZERO::operator ()(Angle a) const {
55                 return 0.0;
56         }
57
58         ONE::ONE() {
59         }
60         double ONE::operator ()(double x) const {
61                 return 1.0;
62         }
63         double ONE::operator ()(Angle a) const {
64                 return 1.0;
65         }
66
67
68         ////////        SIN     ////////
69
70         SIN::SIN() : amplitude(0), wavelength(0), phase(0)  {
71         }
72         SIN::SIN(const SIN &w) {
73                 *this = w;
74         }
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.");
77         }
78         SIN & SIN::set(double lngth, double amp, Angle phs) {
79                 amplitude = amp;
80                 wavelength = lngth;
81                 phase = phs;
82                 if(wavelength<=0) throw(typeid(*this), "Range Error", "Wave length must be positive number.");
83                 return *this;
84         }
85         double SIN::operator ()(double x) const {
86                 return this->operator()((360*x/wavelength));
87         }
88         double SIN::operator ()(Angle a) const {
89                 Angle tmp = a+phase;
90                 return ::sin(tmp.at_radian()) * amplitude;
91         }
92
93
94         ////////        COS, TAN        ////////
95
96         double COS::operator ()(double x) const {
97                 return this->operator()((360*x/wavelength));
98         }
99         double COS::operator ()(Angle a) const {
100                 Angle tmp = a+phase;
101                 return ::cos(tmp.at_radian()) * amplitude;
102         }
103
104         double TAN::operator ()(double x) const {
105                 return this->operator()((360*x/wavelength));
106         }
107         double TAN::operator ()(Angle a) const {
108                 Angle tmp = a+phase;
109                 return ::tan(tmp.at_radian()) * amplitude;
110         }
111
112
113         ////////        PULSE   ////////
114
115         PULSE::PULSE(const PULSE &w) {
116                 *this = w;
117         }
118         PULSE::PULSE(double lngth, double amp, Angle phs, Angle step_boundary) : amplitude(amp), wavelength(lngth), phase(phs), step_boundary_(step_boundary) {
119         }
120         PULSE & PULSE::set(double lngth, double amp, Angle phs, Angle step_boundary) {
121                 amplitude = amp;
122                 wavelength = lngth;
123                 phase = phs;
124                 step_boundary_ = step_boundary;
125                 if(wavelength<=0) throw(typeid(*this), "Range Error", "Wave length must be positive number.");
126                 return *this;
127         }
128         double PULSE::operator ()(double x) const {
129                 return this->operator()((360*x/wavelength));
130         }
131         double PULSE::operator ()(Angle a) const {
132                 if(a.clip()<step_boundary_) {
133                         return 1.0;
134                 } else {
135                         return 0.0;
136                 }
137         }
138
139         MONOMIAL::MONOMIAL(const MONOMIAL &w) {
140                 *this = w;
141         }
142         MONOMIAL::MONOMIAL(int dgr, double fct) : degree(dgr), factor(fct) {
143         }
144         MONOMIAL & MONOMIAL::set(int dgr, double fct) {
145                 degree = dgr;
146                 factor = fct;
147                 return *this;
148         }
149         double MONOMIAL::operator ()(double x) const {
150                 return factor * pow(x, degree);
151         }
152
153         LINEAR::LINEAR(double fct) {
154                 degree = 1;
155                 factor = fct;
156         }
157         LINEAR & LINEAR::set(double fct) {
158                 factor = fct;
159                 return *this;
160         }
161         double LINEAR::operator ()(double x) const {
162                 return factor*x;
163         }
164
165
166 }       /*      <- namespace Waveform   */
167 }       /*      <- namespace Psychlops  */