7 #include "leastsquares.hh"
24 Stem_info(const Stem*);
27 Stem_info::Stem_info(const Stem*s)
31 idealy = MAX(dir*s->top, dir*s->bot);
32 miny = MAX(dir*s->minnote, dir*s-> maxnote);
33 assert(miny <= idealy);
49 stems.bottom().add(s);
50 s->print_flag = false;
54 Beam::set_default_dir()
57 dirs[0]=0; dirs[1] =0;
58 for (PCursor<Stem*> sc(stems); sc.ok(); sc++) {
59 sc->set_default_dir();
60 dirs[(sc->dir+1)/2] ++;
62 dir = (dirs[0] > dirs[1]) ? -1 : 1;
63 for (PCursor<Stem*> sc(stems); sc.ok(); sc++) {
69 should use minimum energy formulation (cf linespacing)
74 svec<Stem_info> sinfo;
75 for (PCursor<Stem* >sc(stems); sc.ok(); sc++) {
76 sc->set_default_extents();
80 Real leftx = sinfo[0].x;
82 for (int i=0; i < sinfo.sz(); i++) {
84 l.input.add(Offset(sinfo[i].x, sinfo[i].idealy));
87 l.minimise(slope, left_pos);
89 for (int i=0; i < sinfo.sz(); i++) {
90 Real y = sinfo[i].x * slope + left_pos;
91 Real my = sinfo[i].miny;
105 PCursor<Stem*> s(stems);
107 for (; s.ok() ; s++) {
108 Real x = s->hpos()-x0;
109 s->set_stemend(left_pos + slope * x);
116 assert(stems.size()>1);
132 for (PCursor<Stem*> i(stems); i.ok(); i++)
133 i->beams_left = i->beams_right = intlog2(ABS(i->flag)) - 2;
135 stems.top()->beams_left = 0;
136 stems.bottom()->beams_right = 0;
145 Beam::broken_at( PCol *, PCol *) const
147 return new Beam(*this);
153 left = (*stems.top()) ->pcol_;
154 right = (*stems.bottom())->pcol_;
160 return output->extent().y;
166 Beam * me = (Beam*) this; // ugh
167 return Interval( (*me->stems.top()) ->hpos(),
168 (*me->stems.bottom()) ->hpos() );
172 beams to go with one stem.
175 Beam::stem_beams(Stem *here, Stem *next, Stem *prev)
177 assert( !next || next->hpos() > here->hpos() );
178 assert( !prev || prev->hpos() < here->hpos() );
179 Real dy=paper()->internote()*2;
180 Real stemdx = paper()->rule_thickness();
181 Real sl = slope*paper()->internote();
182 paper()->lookup_->beam(sl, convert_dimen(20,"pt"));
183 slope = sl /paper()->internote();
187 /* half beams extending to the left. */
189 int lhalfs= lhalfs = here->beams_left - prev->beams_right ;
190 int lwholebeams= here->beams_left <? prev->beams_right ;
191 Real w = (here->hpos() - prev->hpos())/4;
192 Atom a = paper()->lookup_->beam(sl, w);
193 a.translate(Offset (-w, -w * sl));
194 for (int j = 0; j < lhalfs; j++) {
196 b.translate(Offset(0, -dir * dy * (lwholebeams+j)));
202 int rhalfs = here->beams_right - next->beams_left;
203 int rwholebeams = here->beams_right <? next->beams_left;
205 Real w = next->hpos() - here->hpos();
206 Atom a = paper()->lookup_->beam(sl, w + stemdx);
209 for (; j < rwholebeams; j++) {
211 b.translate(Offset(0, -dir * dy * j));
215 a = paper()->lookup_->beam(sl, w);
217 for (; j < rwholebeams + rhalfs; j++) {
219 b.translate(Offset(0, -dir * dy * j));
224 leftbeams.add(rightbeams);
230 Beam::brew_molecule()
232 assert(left->line == right->line);
233 Real inter=paper()->internote();
234 output = new Molecule;
235 Real x0 = stems.top()->hpos();
237 for (PCursor<Stem*> i(stems); i.ok(); i++) {
238 PCursor<Stem*> p(i-1);
239 PCursor<Stem*> n(i+1);
240 Stem * prev = p.ok() ? p.ptr() : 0;
241 Stem * next = n.ok() ? n.ptr() : 0;
243 Molecule sb = stem_beams(i, next, prev);
244 Real x = i->hpos()-x0;
245 sb.translate(Offset(x, (x * slope + left_pos)* inter));
248 output->translate(Offset(x0 - left->hpos,0));
255 mtor << "{ slope " <<slope << "left ypos " << left_pos;