Repository navigation
Expand file tree
/
Copy pathconvolution_sum.cpp
More file actions
57 lines (45 loc) · 1.71 KB
/
Copy pathconvolution_sum.cpp
File metadata and controls
57 lines (45 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "AnalyticDrawing.h"
#include <raylib.h>
#include <vector>
class ConvolutionSum : public AnalyticDraw
{
private:
float altSinir;
float ustSinir;
float artisMiktari;
std::vector<Vector2> points;
public:
ConvolutionSum(float altSinir = 0.0f, float ustSinir = 2.0f, float artisMiktari = 0.001f)
{
this -> altSinir = altSinir;
this -> ustSinir = ustSinir;
this -> artisMiktari = artisMiktari;
}
template<typename Func1, typename Func2, typename... Args>
void CalcConvSum(Func1 firstSignal, Func2 secondSignal)
{
float convValue;
points.clear();
for(float i = 0; i < ustSinir; i += artisMiktari )
{
auto convFunc = [=](auto time, auto a, auto f) {return firstSignal(time, a, f) * secondSignal(i-time,f);};
convValue = Integrate(altSinir, i, 1000, convFunc, 5.0f, 10.0f);
points.push_back({10 * (i * 100) + (800), -((convValue) * 100) + (450)});
}
}
void DrawConvolutionGraph()
{
DrawSplineBezierCubic(points.data(), points.size(), 2, GREEN);
}
template<typename Func, typename... Args>
float Integrate(float a, float b, int steps, Func func, Args... args)
{
float h = (b - a) / steps;
float area = 0.5f * (func(a, args...) + func(b, args...));
for(int i = 1; i < steps; ++i)
{
area += func(a + i * h, args...);
}
return area * h;
}
};