// draws a an arc to two tangents connecting (current) to (x1,y1) and (x1,y1) to (x2,y2), also a straight line from (current) to (x1,y1) void wxGraphicsPathData::AddArcToPoint( wxDouble x1, wxDouble y1 , wxDouble x2, wxDouble y2, wxDouble r ) { wxPoint2DDouble current; GetCurrentPoint(¤t.m_x,¤t.m_y); wxPoint2DDouble p1(x1,y1); wxPoint2DDouble p2(x2,y2); wxPoint2DDouble v1 = current - p1; v1.Normalize(); wxPoint2DDouble v2 = p2 - p1; v2.Normalize(); wxDouble alpha = v1.GetVectorAngle() - v2.GetVectorAngle(); if ( alpha < 0 ) alpha = 360 + alpha; // TODO obtuse angles alpha = DegToRad(alpha); wxDouble dist = r / sin(alpha/2) * cos(alpha/2); // calculate tangential points wxPoint2DDouble t1 = dist*v1 + p1; wxPoint2DDouble nv1 = v1; nv1.SetVectorAngle(v1.GetVectorAngle()-90); wxPoint2DDouble c = t1 + r*nv1; wxDouble a1 = v1.GetVectorAngle()+90; wxDouble a2 = v2.GetVectorAngle()-90; AddLineToPoint(t1.m_x,t1.m_y); AddArc(c.m_x,c.m_y,r,DegToRad(a1),DegToRad(a2),true); AddLineToPoint(p2.m_x,p2.m_y); }
void CSimPetriDoc::CreateOMPDoc(CString pathToFile) { ompMode = TRUE; delete stepper; //Créer le squelette const std::wstring pathName(pathToFile); const wchar_t *separator = _T(";"); omp::Reader dataReader(pathName, separator); omp::PetriOMP omp(dataReader, skeleton); //Créer le stepper stepper = new pm::TrackableStepper(&skeleton, &timer); //Ajouter les places double radiusPlaces = ((double)(3)/4) * min(size.cx/2, size.cy/2); pm::Places places = skeleton.getPlaces(); unsigned index = 0; for(auto it=places.begin(); it!=places.end(); ++it) { int x(size.cx/2 + radiusPlaces*std::cos(((double)(index)/places.size())*2*3.14)); int y(-size.cy/2 + radiusPlaces*std::sin(((double)(index)/places.size())*2*3.14)); shapesMap.insert(std::make_pair(*it, AddPlace(Point(x,y), *it))); ++index; } //Ajouter les transitions double radiusTrans = ((double)(1)/2) * min(size.cx/2, size.cy/2); pm::Transitions transitions = skeleton.getTransitions(); index = 0; for(auto it=transitions.begin(); it!=transitions.end(); ++it) { Point source = shapesMap.at((*it)->getInputArcs().front()->getSourceNode())->GetPosition(); Point end = shapesMap.at((*it)->getOutputArcs().front()->getEndNode())->GetPosition(); //int x(size.cx/2 + radiusTrans*std::cos(((double)(index)/transitions.size())*2*3.14)); //int y(-size.cy/2 + radiusTrans*std::sin(((double)(index)/transitions.size())*2*3.14)); shapesMap.insert(std::make_pair(*it, AddTransition(Geometry::MiddlePoint(source, end), *it))); ++index; } //Ajouter les arcs pm::Arcs arcs = skeleton.getArcs(); std::vector<Point> nullVector; for(auto it=arcs.begin(); it!=arcs.end(); ++it) AddArc(shapesMap.at((*it)->getSourceNode()), shapesMap.at((*it)->getEndNode()), nullVector, *it); }
void CFX_PathGenerator::AddPie(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height, FX_FLOAT start_angle, FX_FLOAT sweep_angle) { if (sweep_angle == 0) { int old_count = m_pPathData->GetPointCount(); m_pPathData->AddPointCount(2); m_pPathData->SetPoint(old_count, x, y, FXPT_MOVETO); m_pPathData->SetPoint(old_count + 1, x + (width * FXSYS_cos(start_angle)), y + (height * FXSYS_sin(start_angle)), FXPT_LINETO); return; } AddArc(x, y, width, height, start_angle, sweep_angle); m_pPathData->AddPointCount(1); m_pPathData->SetPoint(m_pPathData->GetPointCount() - 1, x, y, FXPT_LINETO | FXPT_CLOSEFIGURE); }
void CFX_PathGenerator::AddEllipse(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height) { #if 0 FX_FIXFLOAT16 k; k = fix16_to_8(fixsqrt_32_to_16(fixmul_8_8_to_32(width, width) + fixmul_8_8_to_32(height, height)) / 2); int old_count = m_pPathData->GetPointCount(); m_pPathData->AddPointCount(7); m_pPathData->SetPoint(old_count, x, y - height / 2, FXPT_MOVETO); m_pPathData->SetPoint(old_count + 1, x + k, y - height / 2, FXPT_BEZIERTO); m_pPathData->SetPoint(old_count + 2, x + k, y + height / 2, FXPT_BEZIERTO); m_pPathData->SetPoint(old_count + 3, x, y + height / 2, FXPT_BEZIERTO); m_pPathData->SetPoint(old_count + 4, x - k, y + height / 2, FXPT_BEZIERTO); m_pPathData->SetPoint(old_count + 5, x - k, y - height / 2, FXPT_BEZIERTO); m_pPathData->SetPoint(old_count + 6, x, y - height / 2, FXPT_BEZIERTO); #else AddArc(x, y, width, height, 0, FX_PI * 2); #endif }
void wxGraphicsPathData::AddCircle( wxDouble x, wxDouble y, wxDouble r ) { MoveToPoint(x+r,y); AddArc( x,y,r,0,2*M_PI,false); CloseSubpath(); }
void wxGraphicsPath::AddArc( const wxPoint2DDouble& c, wxDouble r, wxDouble startAngle, wxDouble endAngle, bool clockwise) { AddArc(c.m_x, c.m_y, r, startAngle, endAngle, clockwise); }
//AddArc-------------------------------------------------------------------- Status GraphicsPath::AddArc( const RectF& rect, REAL startAngle, REAL sweepAngle ) { return AddArc( rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle ); }
int main(int argc, char *argv[]) { AdjBoxPtr my_box; CreateAdjBox(&my_box); AddPoint(my_box, 1); AddPoint(my_box, 2); AddPoint(my_box, 3); AddPoint(my_box, 4); AddPoint(my_box, 5); AddPoint(my_box, 6); AddPoint(my_box, 7); AddPoint(my_box, 8); AddPoint(my_box, 9); AddArc(my_box, 1, 2); AddArc(my_box, 1, 7); AddArc(my_box, 1, 6); AddArc(my_box, 2, 3); AddArc(my_box, 2, 9); AddArc(my_box, 2, 7); AddArc(my_box, 2, 1); AddArc(my_box, 3, 4); AddArc(my_box, 3, 9); AddArc(my_box, 3, 2); AddArc(my_box, 4, 5); AddArc(my_box, 4, 8); AddArc(my_box, 4, 7); AddArc(my_box, 4, 9); AddArc(my_box, 4, 3); AddArc(my_box, 5, 6); AddArc(my_box, 5, 8); AddArc(my_box, 5, 4); AddArc(my_box, 6, 1); AddArc(my_box, 6, 7); AddArc(my_box, 6, 5); AddArc(my_box, 7, 1); AddArc(my_box, 7, 2); AddArc(my_box, 7, 4); AddArc(my_box, 7, 8); AddArc(my_box, 7, 6); AddArc(my_box, 8, 4); AddArc(my_box, 8, 5); AddArc(my_box, 8, 7); AddArc(my_box, 9, 2); AddArc(my_box, 9, 3); AddArc(my_box, 9, 4); ShowAdjBox(my_box); DFSTraverse(my_box, 1); // DFSwithStack(my_box, 1); return 0; }
void main() { RealMap * rm = CreateRM(); //AddNode(rm, 1, 33); //AddNode(rm, 2, 44); //AddNode(rm, 3, 55); //AddNode(rm, 4, 66); //AddNode(rm, 5, 77); //AddArc(rm, 2, 3, 41); //AddArc(rm, 1, 3, 16); //AddArc(rm, 1, 2, 78); //AddArc(rm, 2, 1, 78); ////AddArc(rm, 1, 7, 78); //AddArc(rm, 1, 4, 78); //AddArc(rm, 1, 4, 78); //AddArc(rm, 1, 5, 78); //AddArc(rm, 4, 5, 78); //AddArc(rm, 3, 4, 78); //AddArc(rm, 3, 1, 78); //PrintRM(rm); //UpdateArc(rm, 1, 4, 9999, 1); ////DeleteArc(rm, 1, 5); ////DeleteArc(rm, 1, 2); ////DeleteArc(rm, 1, 3); ////DeleteArc(rm, 1, 7); //DeleteNode(rm, 1); //PrintRM(rm); //EmptyRM(rm); //PrintRM(rm); AddNode(rm, 1, 33); AddNode(rm, 2, 44); AddNode(rm, 3, 55); AddNode(rm, 4, 66); AddNode(rm, 5, 77); AddNode(rm, 6, 33); AddNode(rm, 7, 44); AddNode(rm, 8, 55); AddNode(rm, 9, 66); AddNode(rm, 10, 77); AddArc(rm, 1, 2, 78); AddArc(rm, 1, 3, 78); AddArc(rm, 1, 4, 78); AddArc(rm, 2, 5, 78); AddArc(rm, 3, 5, 78); AddArc(rm, 3, 7, 78); AddArc(rm, 4, 6, 78); AddArc(rm, 4, 7, 78); AddArc(rm, 5, 6, 78); AddArc(rm, 5, 7, 78); AddArc(rm, 8, 9, 78); // 得到图有多少个连通域 int count = DomainNum(rm); DestoryRM(rm); }
void CFX_PathGenerator::AddEllipse(FX_FLOAT x, FX_FLOAT y, FX_FLOAT width, FX_FLOAT height) { AddArc(x, y, width, height, 0, FX_PI * 2); }