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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| class Function {
AbstractNode& m_root;
public:
Function(AbstractNode& root) : m_root(root) { }
double operator()(double x) { return m_root(x); }
};
// un noeud / feuille de l'arbre
class AbstractNode {
public:
virtual ~AbstractNode() { }
virtual double operator()(double) = 0;
};
// feuilles
class XNode : public AbstractNode {
public:
virtual operator()(double x) { return x; }
};
class ConstNode : public AbstractNode {
double m_value;
public:
ConstNode(double value) : m_value(value){ }
virtual double operator()(double) {return m_value; }
};
// noeud unaire (+, -, sin ...)
class UnaryNode : public AbstractNode {
AbstractNode& m_child;
public:
UnaryNode(AbstractNode& child) : m_child(child) { }
virtual ~UnaryNode() { }
virtual double operator()(double x) { return internalFct(m_child(x)); }
protected:
virtual double internalFct(double) = 0;
};
// noeud binaire (*, /, %, ...)
class BinaryNode : public AbstractNode {
AbstractNode& m_leftChild;
AbstractNode& m_rightChild;
public:
BinaryNode(AbstractNode& leftChild, AbstractNode& rightChild) : m_leftChild(leftChild), m_rightChild(rightChild) { }
virtual ~BinaryNode() { }
virtual double operator()(double x) { return internalFct(m_leftChild(x), m_rightChild(x)); }
protected:
virtual double internalFct(double, double) = 0;
};
class MultiplyNode : public BinaryNode {
public:
MultiplyNode(AbstractNode& leftChild, AbstractNode& rightChild) : BinaryNode(leftChild, rightChild) { }
protected:
virtual double internalFct(double left, double right) { return left * right; }
};
class SinusNode : public UnaryNode {
public:
SinusNode(AbstractNode& child) : UnaryNode(child) { }
protected:
virtual double internalFct(double x) { return std::sin(x); }
};
class PolyNode : public UnaryNode {
std::vector<double> m_coeff;
public:
PolyNode(AbstractNode& child, const std::vector<double>& coeff) : Node(child), m_coeff(coeff) { }
protected:
virtual double internalFct(double x) {
double ret = 0.0;
for(int i=0; i<m_coeff.size(); ++i) {
ret += pow(x, i) * m_coeff[i];
}
return ret;
}
}; |
Partager