]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/offset.hh
(try_music): ignore slurs_. Otherwise we
[lilypond.git] / flower / include / offset.hh
1 /*
2   offset.hh -- part of GNU LilyPond
3
4   (c) 1996--2004 Han-Wen Nienhuys
5 */
6
7 #ifndef OFFSET_HH
8 #define OFFSET_HH
9
10 #include "flower-proto.hh"
11 #include "real.hh"
12 #include "axes.hh"
13 #include "arithmetic-operator.hh"
14 #include "string.hh"
15
16 Offset complex_multiply (Offset, Offset);
17 Offset complex_divide (Offset, Offset);
18 Offset complex_exp (Offset);
19
20
21 /*
22
23 This is a mixture a 2D vector. Sometimes it can
24 also be convenient to think of 2D vectors as complex numbers
25 (ie. x + i y). The naming of some methods reflects that.
26
27 */
28 class Offset 
29 {
30 public:
31   Real coordinate_a_[NO_AXES];
32     
33   Real &operator[] (Axis i) 
34   {
35     return coordinate_a_[i];
36   }
37
38   Real operator[] (Axis i) const
39   {
40     return coordinate_a_[i];
41   }
42     
43   Offset& operator+= (Offset o) 
44   {
45     (*this)[X_AXIS] += o[X_AXIS];
46     (*this)[Y_AXIS] += o[Y_AXIS];
47     return *this;
48   }
49
50   Offset operator - () const 
51   {
52     Offset o = *this;
53     
54     o[X_AXIS]  = - o[X_AXIS];
55     o[Y_AXIS]  = - o[Y_AXIS];
56     return o;
57   }
58
59   Offset& operator-= (Offset o) 
60   {
61     (*this)[X_AXIS] -= o[X_AXIS];
62     (*this)[Y_AXIS] -= o[Y_AXIS];
63
64     return *this;
65   }
66   
67   Offset &scale (Offset o) 
68   {
69     (*this)[X_AXIS] *= o[X_AXIS];
70     (*this)[Y_AXIS] *= o[Y_AXIS];
71
72     return *this;
73   }
74
75   Offset &operator *= (Real a) 
76   {
77     (*this)[X_AXIS] *= a;
78     (*this)[Y_AXIS] *= a;
79
80     return *this;
81   }
82       
83   Offset (Real ix , Real iy) 
84   {
85     coordinate_a_[X_AXIS] =ix;
86     coordinate_a_[Y_AXIS] =iy;    
87   }
88
89   Offset () 
90   {
91     coordinate_a_[X_AXIS] = coordinate_a_[Y_AXIS]= 0.0;
92   }
93
94   String to_string () const;
95
96   Offset& mirror (Axis a)
97   {
98     coordinate_a_[a] = - coordinate_a_[a];
99     return *this;
100   }
101   
102   Real arg () const;
103   Real length () const;
104
105   Offset operator *= (Offset z2) 
106   {
107     *this = complex_multiply (*this, z2);
108     return *this;
109   }
110
111 };
112
113 IMPLEMENT_ARITHMETIC_OPERATOR (Offset, +);
114 IMPLEMENT_ARITHMETIC_OPERATOR (Offset, -);
115 IMPLEMENT_ARITHMETIC_OPERATOR (Offset, *);
116
117 inline Offset
118 operator* (Real o1, Offset o2)
119 {
120   o2 *= o1;
121   return o2;
122 }
123
124 inline Offset
125 operator* (Offset o1, Real o2)
126 {
127   o1 *= o2;
128   return o1;
129 }
130
131 inline Offset
132 mirror (Offset o, Axis a)
133 {
134   o.mirror (a);
135   return o;
136 }
137
138 inline
139 Real
140 dot_product  (Offset o1, Offset o2)
141 {
142   return o1[X_AXIS] * o2[X_AXIS] + o1[Y_AXIS] * o2[Y_AXIS];
143 }
144
145
146 #endif /* OFFSET_HH */
147
148