6 #include "leastsquares.hh"
23 Stem_info(const Stem*);
25 Stem_info::Stem_info(const Stem*s)
29 idealy = MAX(dir*s->top, dir*s->bot);
30 miny = MAX(dir*s->minnote, dir*s-> maxnote);
31 assert(miny <= idealy);
47 stems.bottom().add(s);
48 s->print_flag = false;
52 Beam::set_default_dir()
55 dirs[0]=0; dirs[1] =0;
56 for (PCursor<Stem*> sc(stems); sc.ok(); sc++) {
57 sc->set_default_dir();
58 dirs[(sc->dir+1)/2] ++;
60 dir = (dirs[0] > dirs[1]) ? -1 : 1;
61 for (PCursor<Stem*> sc(stems); sc.ok(); sc++) {
67 should use minimum energy formulation (cf linespacing)
72 svec<Stem_info> sinfo;
73 for (PCursor<Stem* >sc(stems); sc.ok(); sc++) {
74 sc->set_default_extents();
78 Real leftx = sinfo[0].x;
80 for (int i=0; i < sinfo.sz(); i++) {
82 l.input.add(Offset(sinfo[i].x, sinfo[i].idealy));
85 l.minimise(slope, left_pos);
87 for (int i=0; i < sinfo.sz(); i++) {
88 Real y = sinfo[i].x * slope + left_pos;
89 Real my = sinfo[i].miny;
103 PCursor<Stem*> s(stems);
105 for (; s.ok() ; s++) {
106 Real x = s->hpos()-x0;
107 s->set_stemend(left_pos + slope * x);
114 assert(stems.size()>1);
130 for (PCursor<Stem*> i(stems); i.ok(); i++)
131 i->beams_left = i->beams_right = intlog2(ABS(i->flag)) - 2;
133 stems.top()->beams_left = 0;
134 stems.bottom()->beams_right = 0;
143 Beam::broken_at(const PCol *, const PCol *) const
145 return new Beam(*this);
151 left = (*stems.top()) ->pcol_;
152 right = (*stems.bottom())->pcol_;
158 return output->extent().y;
164 Beam * me = (Beam*) this; // ugh
165 return Interval( (*me->stems.top()) ->hpos(),
166 (*me->stems.bottom()) ->hpos() );
169 beams to go with one stem.
172 Beam::stem_beams(Stem *here, Stem *next, Stem *prev)
174 assert( !next || next->hpos() > here->hpos() );
175 assert( !prev || prev->hpos() < here->hpos() );
176 Real dy=paper()->internote()*2;
177 Real stemdx = paper()->rule_thickness();
178 Real sl = slope*paper()->internote();
182 /* half beams extending to the left. */
184 int lhalfs= lhalfs = here->beams_left - prev->beams_right ;
185 int lwholebeams= here->beams_left <? prev->beams_right ;
186 Real w = (here->hpos() - prev->hpos())/4;
187 Atom a = paper()->lookup_->beam(sl, w);
188 a.translate(Offset (-w, -w * sl));
189 for (int j = 0; j < lhalfs; j++) {
191 b.translate(Offset(0, -dir * dy * (lwholebeams+j)));
197 int rhalfs = here->beams_right - next->beams_left;
198 int rwholebeams = here->beams_right <? next->beams_left;
200 Real w = next->hpos() - here->hpos();
201 Atom a = paper()->lookup_->beam(sl, w + stemdx);
204 for (; j < rwholebeams; j++) {
206 b.translate(Offset(0, -dir * dy * j));
210 a = paper()->lookup_->beam(sl, w);
212 for (; j < rwholebeams + rhalfs; j++) {
214 b.translate(Offset(0, -dir * dy * j));
219 leftbeams.add(rightbeams);
225 Beam::brew_molecule()
227 assert(left->line == right->line);
228 Real inter=paper()->internote();
229 Real sl = slope*inter;
231 output = new Molecule;
233 Real x0 = stems.top()->hpos();
235 for (PCursor<Stem*> i(stems); i.ok(); i++) {
236 PCursor<Stem*> p(i-1);
237 PCursor<Stem*> n(i+1);
238 Stem * prev = p.ok() ? p.ptr() : 0;
239 Stem * next = n.ok() ? n.ptr() : 0;
241 Molecule sb = stem_beams(i, next, prev);
242 Real x = i->hpos()-x0;
243 sb.translate(Offset(x, (x * slope + left_pos)* inter));
246 output->translate(Offset(x0 - left->hpos,0));
253 mtor << "{ slope " <<slope << "left ypos " << left_pos;