// public BeanTriangulationDelaunay GetTriangulationDeDelaunayByDicoPoints(Dictionary <int, Point> p_dicoPointsAvecId, int p_srid) { BeanTriangulationDelaunay v_trOut = null; try { BeanAlimentationVoronoi v_BeanDAlimentation = GetBeanAlimentationVoronoiByDicoPoints(p_dicoPointsAvecId, p_srid); v_BeanDAlimentation.p12_parametrage.gestionPointsDupliques = enumVoronoiStrategiePointsDupliques.deduplicationAleatoire; if (!v_BeanDAlimentation.p22_contientObjetsInvalidesVf) { VoronoiGraph v_voronoiGraph = GetVoronoiGraph(v_BeanDAlimentation); v_trOut = GetTriangulationDelaunayByVoronoiGraph(v_voronoiGraph, v_BeanDAlimentation); //Je remets la source d'origine, par "sécurité" v_trOut.p00_PointIGeometrySources = p_dicoPointsAvecId; // } } catch (Exception v_ex) { throw v_ex; } return(v_trOut); }
public Dictionary <int, IGeometry> GetArcsDelaunayGeometryByTriangulationDelaunay(BeanTriangulationDelaunay p_triangulationDelaunay) { Dictionary <int, IGeometry> v_arcs = new Dictionary <int, IGeometry>(); try { int v_index = 0; foreach (BeanArcDelaunay v_arcDelaunay in p_triangulationDelaunay.p01_arcsDelaunay) { v_arcs.Add(v_index, v_arcDelaunay.p30_arcDelaunay); v_index++; } } catch (Exception) { throw; } return(v_arcs); }
//public BeanTopologie GetBeanTopologieByVoronoiGraph(VoronoiGraph p_voronoiGraph, BeanAlimentationVoronoi p_beanAlimentationVoronoi) //{ // BeanTopologie v_topologieVoronoi = new BeanTopologie(); // try // { // Dictionary<int, BeanArc_internal> v_arcs = new Dictionary<int, BeanArc_internal>(); // Dictionary<int, int> v_DicoPointSourceGaucheParArc = new Dictionary<int, int>(); // Dictionary<int, int> v_DicoPointSourceDroitParArc = new Dictionary<int, int>(); // //Création du réseau // BeanTopologie v_topologieLignes = new BeanTopologie(); // double v_vorX_Left; // double v_vorY_Left; // double v_vorX_Right; // double v_vorY_Right; // double v_OrigX_Left; // double v_OrigY_Left; // double v_OrigX_Right; // double v_OrigY_Right; // double v_CorrectionX = 0; // double v_CorrectionY = 0; // ITopologieService v_topologieService = new TopologieService(); // IGeometry v_line; // String v_CodeXYPointGauche; // String v_CodeXYPointDroit; // int v_KeyPointGauche; // int v_KeyPointDroit; // int v_KeyArc = 0; // HashSet<string> v_testDoublesLignes = new HashSet<string>(); // string v_codeLigne; // if (p_beanAlimentationVoronoi.parametrage.reductionCoordonneesVf) // { // v_CorrectionX = (double)p_beanAlimentationVoronoi.origineXCorrigee; // v_CorrectionY = (double)p_beanAlimentationVoronoi.origineYCorrigee; // } // foreach (VoronoiEdge v_Edges in p_voronoiGraph.Edges) // { // if (!v_Edges.IsInfinite && !v_Edges.IsPartlyInfinite) // { // v_KeyArc++; // //Je créé des variables intermédiaires car modifierLaGeometrie directement le vecteur pose graves pb // v_vorX_Left = v_Edges.VVertexA[0] + v_CorrectionX; // v_vorY_Left = v_Edges.VVertexA[1] + v_CorrectionY; // v_vorX_Right = v_Edges.VVertexB[0] + v_CorrectionX; // v_vorY_Right = v_Edges.VVertexB[1] + v_CorrectionY; // v_OrigX_Left = v_Edges.LeftData[0] + v_CorrectionX; // v_OrigY_Left = v_Edges.LeftData[1] + v_CorrectionY; // v_OrigX_Right = v_Edges.RightData[0] + v_CorrectionX; // v_OrigY_Right = v_Edges.RightData[1] + v_CorrectionY; // // // v_line = v_topologieService.GetLineStringByCoord(v_vorX_Left, v_vorY_Left, v_vorX_Right, v_vorY_Right); // if (v_line.Length > 0) // { // v_CodeXYPointGauche = GetCodeXY(v_OrigX_Left, v_OrigY_Left); // v_CodeXYPointDroit = GetCodeXY(v_OrigX_Right, v_OrigY_Right); // //J'ai rencontré des duplications de lignes (dans un sens et dans l'autre) // //Ces cas provoquent des boucles sans fin dans la fermeture d'îlots // // Je mets un patch : A réintégrer DANS TOPOLOGIE SERVICE // if (v_OrigX_Left < v_OrigX_Right) // { // v_codeLigne = v_CodeXYPointGauche + "_" + v_CodeXYPointDroit; // } // else // { // if (v_OrigX_Left == v_OrigX_Right) // { // if (v_OrigY_Left < v_OrigY_Right) // { // v_codeLigne = v_CodeXYPointGauche + "_" + v_CodeXYPointDroit; // } // else // { v_codeLigne = v_CodeXYPointDroit + "_" + v_CodeXYPointGauche; } // } // else // { v_codeLigne = v_CodeXYPointDroit + "_" + v_CodeXYPointGauche; } // } // //Si la ligne est déjà contenue, je ne l'introduis pas // if (v_testDoublesLignes.Contains(v_codeLigne)) { break; } // // // v_arcs.Add(v_KeyArc, v_line); // v_KeyPointGauche = -1; // if (p_beanAlimentationVoronoi.dicoLienCodeXyKeySource.ContainsKey(v_CodeXYPointGauche)) // { // p_beanAlimentationVoronoi.dicoLienCodeXyKeySource.TryGetValue(v_CodeXYPointGauche, out v_KeyPointGauche); // } // v_DicoPointSourceGaucheParArc.Add(v_KeyArc, v_KeyPointGauche); // v_KeyPointDroit = -1; // if (p_beanAlimentationVoronoi.dicoLienCodeXyKeySource.ContainsKey(v_CodeXYPointGauche)) // { // p_beanAlimentationVoronoi.dicoLienCodeXyKeySource.TryGetValue(v_CodeXYPointDroit, out v_KeyPointDroit); // } // v_DicoPointSourceDroitParArc.Add(v_KeyArc, v_KeyPointDroit); // } // }//Fin if (!v_Edges.IsInfinite && !v_Edges.IsPartlyInfinite) // }//Fin foreach // //Création de la topologie // v_topologieLignes = v_topologieService.GetTopologie(v_arcs); // ////STRUCTURATION en ILOTS: // //v_topologieVoronoi = v_topologieService.GetTopologieSansImpassesEnrichiesDesIlots(v_topologieLignes); // //v_topologieService.MiseAJourDesIndicateursDeControleTopologieIlot(v_topologieVoronoi); // ////Renumérotation des îlots // //v_topologieService.UpdateIdIlotsByCotesArcs(v_topologieVoronoi, v_DicoPointSourceDroitParArc, v_DicoPointSourceGaucheParArc); // ////FIN STRUCTURATION en ILOTS: // } // catch (Exception v_ex) // { // throw v_ex; // } // return v_topologieVoronoi; //} public BeanTriangulationDelaunay GetTriangulationDelaunayByVoronoiGraph(VoronoiGraph p_voronoiGraph, BeanAlimentationVoronoi p_beanAlimentationVoronoi) { BeanTriangulationDelaunay v_triangulationDelaunay = new BeanTriangulationDelaunay(); try { //[Je filtre les id négatifs: correspondent au Mbo de construction foreach (KeyValuePair <int, Point> v_pointsOriginels in p_beanAlimentationVoronoi.p10_dicoDesPointsSources) { if (v_pointsOriginels.Key >= 0) { v_triangulationDelaunay.p00_PointIGeometrySources.Add(v_pointsOriginels.Key, v_pointsOriginels.Value); } } // double v_OrigX_Left; double v_OrigY_Left; double v_OrigX_Right; double v_OrigY_Right; double v_CorrectionX = 0; double v_CorrectionY = 0; // if (p_beanAlimentationVoronoi.p12_parametrage.reductionCoordonneesVf) { v_CorrectionX = (double)p_beanAlimentationVoronoi.p55_origineXCorrigee; v_CorrectionY = (double)p_beanAlimentationVoronoi.p56_origineYCorrigee; } BeanArcDelaunay v_arcDelaunay; string v_CodeXYPointGauche; string v_CodeXYPointDroit; ITopologieService v_topologieService = new TopologieService(); int v_cleDroite; int v_cleGauche; int v_KeyArc = 0; foreach (VoronoiEdge v_Edges in p_voronoiGraph.Edges) { if (!v_Edges.IsInfinite && !v_Edges.IsPartlyInfinite) { v_KeyArc++; v_OrigX_Left = v_Edges.LeftData[0] + v_CorrectionX; v_OrigY_Left = v_Edges.LeftData[1] + v_CorrectionY; v_OrigX_Right = v_Edges.RightData[0] + v_CorrectionX; v_OrigY_Right = v_Edges.RightData[1] + v_CorrectionY; // //v_CodeXYPointGauche = GetCodeXY(v_OrigX_Left, v_OrigY_Left); v_CodeXYPointGauche = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] { v_OrigX_Left, v_OrigY_Left }); //v_CodeXYPointDroit = GetCodeXY(v_OrigX_Right, v_OrigY_Right); v_CodeXYPointDroit = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] { v_OrigX_Right, v_OrigY_Right }); // if (p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.ContainsKey(v_CodeXYPointGauche) && p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.ContainsKey(v_CodeXYPointDroit)) { v_cleGauche = p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint[v_CodeXYPointGauche]; v_cleDroite = p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint[v_CodeXYPointDroit]; if (v_cleDroite >= 0 && v_cleGauche >= 0) { v_arcDelaunay = new BeanArcDelaunay(); v_arcDelaunay.p11_idPoint1 = v_cleGauche; v_arcDelaunay.p21_coordPoint1[0] = v_OrigX_Left; v_arcDelaunay.p21_coordPoint1[1] = v_OrigY_Left; // v_arcDelaunay.p12_idPoint2 = v_cleDroite; v_arcDelaunay.p22_coordPoint2[0] = v_OrigX_Right; v_arcDelaunay.p22_coordPoint2[1] = v_OrigY_Right; // v_arcDelaunay.p00_codeArcDelaunay = GetHCodeArcDelaunay(v_cleGauche, v_cleDroite, true); // v_arcDelaunay.p30_arcDelaunay = v_topologieService.GetLineStringByCoord(v_OrigX_Left, v_OrigY_Left, v_OrigX_Right, v_OrigY_Right); v_triangulationDelaunay.p01_arcsDelaunay.Add(v_arcDelaunay); } } } } } catch (Exception v_ex) { throw v_ex; } return(v_triangulationDelaunay); }