LEFT | RIGHT |
1 /* | 1 /* |
2 This file is part of LilyPond, the GNU music typesetter. | 2 This file is part of LilyPond, the GNU music typesetter. |
3 | 3 |
4 Copyright (C) 2008--2012 Han-Wen Nienhuys <hanwen@lilypond.org> | 4 Copyright (C) 2008--2012 Han-Wen Nienhuys <hanwen@lilypond.org> |
5 | 5 |
6 | 6 |
7 LilyPond is free software: you can redistribute it and/or modify | 7 LilyPond is free software: you can redistribute it and/or modify |
8 it under the terms of the GNU General Public License as published by | 8 it under the terms of the GNU General Public License as published by |
9 the Free Software Foundation, either version 3 of the License, or | 9 the Free Software Foundation, either version 3 of the License, or |
10 (at your option) any later version. | 10 (at your option) any later version. |
(...skipping 10 matching lines...) Expand all Loading... |
21 #include "skyline-pair.hh" | 21 #include "skyline-pair.hh" |
22 | 22 |
23 #include "international.hh" | 23 #include "international.hh" |
24 #include "ly-smobs.icc" | 24 #include "ly-smobs.icc" |
25 | 25 |
26 Skyline_pair::Skyline_pair () | 26 Skyline_pair::Skyline_pair () |
27 : skylines_ (Skyline (DOWN), Skyline (UP)) | 27 : skylines_ (Skyline (DOWN), Skyline (UP)) |
28 { | 28 { |
29 } | 29 } |
30 | 30 |
31 Skyline_pair::Skyline_pair (vector<Box> const &boxes, Real padding, Axis a) | 31 Skyline_pair::Skyline_pair (vector<Box> const &boxes, Axis a) |
32 : skylines_ (Skyline (boxes, padding, a, DOWN), Skyline (boxes, padding, a, UP
)) | 32 : skylines_ (Skyline (boxes, a, DOWN), Skyline (boxes, a, UP)) |
33 { | 33 { |
34 } | 34 } |
35 | 35 |
36 Skyline_pair::Skyline_pair (Box const &b, Real padding, Axis a) | 36 Skyline_pair::Skyline_pair (vector<Drul_array<Offset> > const &buildings, Axis a
) |
37 : skylines_ (Skyline (b, padding, a, DOWN), Skyline (b, padding, a, UP)) | 37 : skylines_ (Skyline (buildings, a, DOWN), Skyline (buildings, a, UP)) |
| 38 { |
| 39 } |
| 40 |
| 41 Skyline_pair::Skyline_pair (vector<Skyline_pair> const &skypairs) |
| 42 : skylines_ (Skyline (skypairs, DOWN), Skyline (skypairs, UP)) |
| 43 { |
| 44 } |
| 45 |
| 46 Skyline_pair::Skyline_pair (Box const &b, Axis a) |
| 47 : skylines_ (Skyline (b, a, DOWN), Skyline (b, a, UP)) |
38 { | 48 { |
39 } | 49 } |
40 | 50 |
41 void | 51 void |
42 Skyline_pair::raise (Real r) | 52 Skyline_pair::raise (Real r) |
43 { | 53 { |
44 skylines_[UP].raise (r); | 54 skylines_[UP].raise (r); |
45 skylines_[DOWN].raise (r); | 55 skylines_[DOWN].raise (r); |
46 } | 56 } |
47 | 57 |
48 void | 58 void |
| 59 Skyline_pair::deholify () |
| 60 { |
| 61 skylines_[UP].deholify (); |
| 62 skylines_[DOWN].deholify (); |
| 63 } |
| 64 |
| 65 void |
49 Skyline_pair::shift (Real r) | 66 Skyline_pair::shift (Real r) |
50 { | 67 { |
51 skylines_[UP].shift (r); | 68 skylines_[UP].shift (r); |
52 skylines_[DOWN].shift (r); | 69 skylines_[DOWN].shift (r); |
53 } | 70 } |
54 | 71 |
55 void | 72 void |
56 Skyline_pair::insert (Box const &b, Real padding, Axis a) | 73 Skyline_pair::insert (Box const &b, Axis a) |
57 { | 74 { |
58 skylines_[UP].insert (b, padding, a); | 75 skylines_[UP].insert (b, a); |
59 skylines_[DOWN].insert (b, padding, a); | 76 skylines_[DOWN].insert (b, a); |
60 } | 77 } |
61 | 78 |
62 Real | 79 Real |
63 Skyline_pair::left () | 80 Skyline_pair::left () const |
64 { | 81 { |
65 return min (skylines_[UP].left (), skylines_[DOWN].left ()); | 82 return min (skylines_[UP].left (), skylines_[DOWN].left ()); |
66 } | 83 } |
67 | 84 |
68 Real | 85 Real |
69 Skyline_pair::right () | 86 Skyline_pair::right () const |
70 { | 87 { |
71 return max (skylines_[UP].right (), skylines_[DOWN].right ()); | 88 return max (skylines_[UP].right (), skylines_[DOWN].right ()); |
| 89 } |
| 90 |
| 91 // This function comes with the same caveats as smallest_shift: |
| 92 // if the skylines are not contiguous, we may report false |
| 93 // intersections. |
| 94 bool |
| 95 Skyline_pair::intersects (Skyline_pair const &other) const |
| 96 { |
| 97 return skylines_[UP].distance (other[DOWN]) > 0 |
| 98 && other[UP].distance (skylines_[DOWN]) > 0; |
| 99 } |
| 100 |
| 101 Real |
| 102 Skyline_pair::smallest_shift (Skyline_pair const &other, Direction d, |
| 103 Real h_pad, Real v_pad) |
| 104 { |
| 105 // If skylines_[UP] avoids other[DOWN] or skylines_[DOWN] avoids |
| 106 // other[UP] then we will not intersect. |
| 107 // Note that this is not guaranteed to return the smallest shift |
| 108 // if one Skyline_pair is not connected: the smallest_shift left |
| 109 // in the case of |
| 110 // AAA |
| 111 // BBBBBB |
| 112 // AAA |
| 113 // will result in |
| 114 // AAA |
| 115 // BBBBBB |
| 116 // AAA |
| 117 // even though the originals did not collide. If it becomes necessary, |
| 118 // this case could be handled by splitting the Skyline_pairs up into |
| 119 // their connected components. |
| 120 |
| 121 return d * min (d * skylines_[UP].smallest_shift (other[DOWN], d, h_pad, v_pad
), |
| 122 d * skylines_[DOWN].smallest_shift (other[UP], d, h_pad, v_pad
)); |
72 } | 123 } |
73 | 124 |
74 void | 125 void |
75 Skyline_pair::merge (Skyline_pair const &other) | 126 Skyline_pair::merge (Skyline_pair const &other) |
76 { | 127 { |
77 skylines_[UP].merge (other[UP]); | 128 skylines_[UP].merge (other[UP]); |
78 skylines_[DOWN].merge (other[DOWN]); | 129 skylines_[DOWN].merge (other[DOWN]); |
79 } | 130 } |
80 | 131 |
81 void | 132 void |
82 Skyline_pair::rebuild_skyline_padding (Real horizon_padding, Axis horizon_axis) | |
83 { | |
84 skylines_[UP].rebuild_skyline_padding (horizon_padding, horizon_axis, UP); | |
85 skylines_[DOWN].rebuild_skyline_padding (horizon_padding, horizon_axis, DOWN); | |
86 } | |
87 | |
88 void | |
89 Skyline_pair::print () const | 133 Skyline_pair::print () const |
90 { | 134 { |
91 skylines_[UP].print (); | 135 skylines_[UP].print (); |
92 skylines_[DOWN].print (); | 136 skylines_[DOWN].print (); |
93 } | 137 } |
94 | 138 |
95 void | 139 void |
96 Skyline_pair::print_points () const | 140 Skyline_pair::print_points () const |
97 { | 141 { |
98 skylines_[UP].print_points (); | 142 skylines_[UP].print_points (); |
99 skylines_[DOWN].print_points (); | 143 skylines_[DOWN].print_points (); |
100 } | 144 } |
101 | 145 |
102 bool | 146 bool |
103 Skyline_pair::is_empty () const | 147 Skyline_pair::is_empty () const |
104 { | 148 { |
105 return skylines_[UP].is_empty () | 149 return skylines_[UP].is_empty () |
106 && skylines_[DOWN].is_empty (); | 150 && skylines_[DOWN].is_empty (); |
| 151 } |
| 152 |
| 153 bool |
| 154 Skyline_pair::is_singleton () const |
| 155 { |
| 156 return skylines_[UP].is_singleton () |
| 157 && skylines_[DOWN].is_singleton (); |
107 } | 158 } |
108 | 159 |
109 Skyline & | 160 Skyline & |
110 Skyline_pair::operator [] (Direction d) | 161 Skyline_pair::operator [] (Direction d) |
111 { | 162 { |
112 return skylines_[d]; | 163 return skylines_[d]; |
113 } | 164 } |
114 | 165 |
115 Skyline const & | 166 Skyline const & |
116 Skyline_pair::operator [] (Direction d) const | 167 Skyline_pair::operator [] (Direction d) const |
(...skipping 29 matching lines...) Expand all Loading... |
146 Direction dir = robust_scm2dir (dir_scm, UP); | 197 Direction dir = robust_scm2dir (dir_scm, UP); |
147 | 198 |
148 if (dir == CENTER) | 199 if (dir == CENTER) |
149 { | 200 { |
150 warning (_f ("direction must not be CENTER in ly:skyline-pair::skyline")); | 201 warning (_f ("direction must not be CENTER in ly:skyline-pair::skyline")); |
151 dir = UP; | 202 dir = UP; |
152 } | 203 } |
153 | 204 |
154 return (*sp)[dir].smobbed_copy (); | 205 return (*sp)[dir].smobbed_copy (); |
155 } | 206 } |
LEFT | RIGHT |