///functor: Run composition itself, separate from load times (e.g. which may include an fst expansion). VectorFst<Arc> * operator() () { if (!fst_.NumStates() ) { LWARN ("Empty lattice. ... Skipping LM application!"); return NULL; } while ( qc_.size() ) { StateId s = qc_.front(); qc_.pop(); pair<StateId, const typename KenLMModelT::State> p = get ( s ); StateId& s1 = p.first; const typename KenLMModelT::State s2 = p.second; for ( ArcIterator< VectorFst<Arc> > arc1 ( fst_, s1 ); !arc1.Done(); arc1.Next() ) { const Arc& a1 = arc1.Value(); float w = 0; float wp = wp_; typename KenLMModelT::State nextlmstate; if ( epsilons_.find ( a1.olabel ) == epsilons_.end() ) { w = lmmodel_.Score ( s2, idbridge_.map (a1.olabel), nextlmstate ) * natlog10_; //silly hack if ( a1.olabel <= 2 ) { wp = 0; if (a1.olabel == 1 ) w = 0; //get same result as srilm } } else { nextlmstate = s2; wp = 0; //We don't count epsilon labels } pair<StateId, bool> nextp = add ( nextlmstate , a1.nextstate , fst_.Final ( a1.nextstate ) ); StateId& newstate = nextp.first; bool visited = nextp.second; composed_->AddArc ( s , Arc ( a1.ilabel, a1.olabel , Times ( a1.weight, Times (mw_ ( w ) , mw_ (wp) ) ) , newstate ) ); //Finally, only add newstate to the queue if it hasn't been visited previously if ( !visited ) { qc_.push ( newstate ); } } } LINFO ( "Done! Number of states=" << composed_->NumStates() ); return composed_; };
int main(){ Simple_window win(Point(100, 100), 600, 400, "Arc"); Graph_lib::Arc arc1(Point(300, 200), 100, 100, 45, 135); Graph_lib::Arc arc2(Point(300, 200), 100, 100, 225, 315); arc1.set_fill_color(Color::dark_green); arc1.set_color(Color::white); arc1.set_style(Line_style(Line_style::solid, 10)); arc2.set_fill_color(Color::dark_blue); arc2.set_color(Color::white); arc2.set_style(Line_style(Line_style::solid, 10)); win.attach(arc1); win.attach(arc2); win.wait_for_button(); }
bool RS_ActionPolylineEquidistant::makeContour() { if (container==NULL) { RS_DEBUG->print("RS_ActionPolylineEquidistant::makeContour: no valid container", RS_Debug::D_WARNING); return false; } RS_Polyline* originalPolyline = (RS_Polyline*)originalEntity; //create a list of entities to offset without length = 0 QList<RS_Entity*> entities; for (RS_Entity* en=originalPolyline->firstEntity(); en!=NULL; en=originalPolyline->nextEntity()) { if (en->getLength() > 1.0e-12) entities.append(en); } if (entities.isEmpty()) { return false; } if (document!=NULL) { document->startUndoCycle(); } double neg = 1.0; if(bRightSide) neg = -1.0; // Create new helper entities RS_Line line1(NULL, RS_LineData(RS_Vector(true), RS_Vector(true)));//current line RS_Line lineFirst(NULL, RS_LineData(RS_Vector(true), RS_Vector(true)));//previous line RS_Arc arc1(NULL, RS_ArcData(RS_Vector(true), 0,0,0,false));//current arc RS_Arc arcFirst(NULL, RS_ArcData(RS_Vector(true), 0,0,0,false));//previous arc for (int num=1; num<=number || (number==0 && num<=1); num++) { RS_Polyline* newPolyline = new RS_Polyline(container); newPolyline->setLayer(((RS_Polyline*)originalEntity)->getLayer()); newPolyline->setPen(((RS_Polyline*)originalEntity)->getPen()); bool first = true; bool closed = originalPolyline->isClosed(); double bulge = 0.0; RS_Entity* en; RS_Entity* prevEntity = entities.last(); RS_Entity* currEntity; for (int i = 0; i < entities.size(); ++i) { en = entities.at(i); RS_Vector v(false); if (en->rtti()==RS2::EntityArc) { currEntity = &arc1; calculateOffset(currEntity, en, dist*num*neg); bulge = arc1.getBulge(); } else { currEntity = &line1; bulge = 0.0; calculateOffset(currEntity, en, dist*num*neg); } if (first) { if (closed) { if (prevEntity->rtti()==RS2::EntityArc) { prevEntity = calculateOffset(&arcFirst, prevEntity, dist*num*neg); } else { prevEntity = calculateOffset(&lineFirst, prevEntity, dist*num*neg); } v = calculateIntersection(prevEntity, currEntity); } if (!v.valid) { v = currEntity->getStartpoint(); closed = false; } else if (currEntity->rtti()==RS2::EntityArc) { //update bulge arc1.setAngle1(arc1.getCenter().angleTo(v)); arc1.calculateEndpoints(); bulge = arc1.getBulge(); } first = false; if (!prevEntity) break; //prevent crash if not exist offset for prevEntity } else { v = calculateIntersection(prevEntity, currEntity); if (!v.valid) { v= prevEntity->getEndpoint(); double dess = currEntity->getStartpoint().distanceTo(prevEntity->getEndpoint()); if (dess > 1.0e-12) { newPolyline->addVertex(v, bulge); prevEntity = NULL; break; } } double startAngle = prevEntity->getStartpoint().angleTo(prevEntity->getEndpoint()); if (prevEntity->rtti()==RS2::EntityArc) { arcFirst.setAngle2(arcFirst.getCenter().angleTo(v)); arcFirst.calculateEndpoints(); newPolyline->setNextBulge(arcFirst.getBulge()); } //check if the entity are reverted if (abs (prevEntity->getStartpoint().angleTo(prevEntity->getEndpoint())- startAngle) > 0.785) { prevEntity = newPolyline->lastEntity(); RS_Vector v0 = calculateIntersection(prevEntity, currEntity); if (prevEntity->rtti()==RS2::EntityArc) { ((RS_Arc*)prevEntity)->setAngle2(arcFirst.getCenter().angleTo(v0)); ((RS_Arc*)prevEntity)->calculateEndpoints(); newPolyline->setNextBulge( ((RS_Arc*)prevEntity)->getBulge() ); } else { ((RS_Line*)prevEntity)->setEndpoint(v0); newPolyline->setNextBulge( 0.0 ); } newPolyline->setEndpoint(v0); } if (currEntity->rtti()==RS2::EntityArc) { arc1.setAngle1(arc1.getCenter().angleTo(v)); arc1.calculateEndpoints(); bulge = arc1.getBulge(); } else bulge = 0.0; } if (prevEntity) { newPolyline->addVertex(v, bulge, false); if (currEntity->rtti()==RS2::EntityArc) { arcFirst.setData(arc1.getData()); arcFirst.calculateEndpoints(); prevEntity = &arcFirst; } else { lineFirst.setStartpoint(line1.getStartpoint()); lineFirst.setEndpoint(line1.getEndpoint()); prevEntity = &lineFirst; } } } //properly terminated, check closed if (prevEntity) { if (closed) { if (currEntity->rtti()==RS2::EntityArc) { arc1.setAngle2(arc1.getCenter().angleTo(newPolyline->getStartpoint())); arc1.calculateEndpoints(); newPolyline->setNextBulge(arc1.getBulge()); bulge = arc1.getBulge(); } newPolyline->setClosed(true, bulge); } else { newPolyline->addVertex(currEntity->getEndpoint(), bulge); } } if (!newPolyline->isEmpty()) { container->addEntity(newPolyline); document->addUndoable(newPolyline); } } if (document!=NULL) { document->endUndoCycle(); } if (graphicView!=NULL) { graphicView->redraw(); } return true; }