//private Result parallelComputing(CellInfo cellInfo, double fromAngle, double toAngle) //{ // string bidstext = "-1"; // LTE.Geometric.Point p = cellInfo.SourcePoint; // ProcessArgs pa = new ProcessArgs(); // ProcessStartInfo psi = new ProcessStartInfo(); // psi.UseShellExecute = true; // psi.ErrorDialog = true; // psi.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory; // psi.FileName = "LTE.MultiProcessController.exe"; // psi.Arguments = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22} {23} {24} {25} {26} {27} {28} {29} {30} {31} {32}", // cellInfo.SourceName, p.X, p.Y, 0, 0, p.Z, cellInfo.eNodeB, cellInfo.CI, // cellInfo.Azimuth, cellInfo.Inclination, cellInfo.cellType, cellInfo.frequncy, cellInfo.EIRP, // cellInfo.directCoefficient, cellInfo.reflectCoefficient, cellInfo.diffracteCoefficient, cellInfo.diffracteCoefficient, // fromAngle, toAngle, this.distance, this.reflectionNum, this.diffractionNum, this.computeIndoor, // this.threadNum, bidstext, this.sideSplitUnit, this.computeVSide, false, false, true, false, LoadInfo.UserId.Value, LoadInfo.taskName.Value); // try // { // pa.pro = Process.Start(psi); // pa.pro.WaitForExit(); // } // catch (InvalidOperationException exception) // { // return new Result(false, "多进程计算启动失败,原因: " + exception.Message); // } // catch (Exception ee) // { // return new Result(false, "多进程计算启动失败,原因: " + ee.Message); // } // return new Result(true); //} private Result parallelComputing(CellInfo cellInfo, double fromAngle, double toAngle, double dis, int userId, string taskName) { string bidstext = "-1"; LTE.Geometric.Point p = cellInfo.SourcePoint; ProcessArgs pa = new ProcessArgs(); ProcessStartInfo psi = new ProcessStartInfo(); psi.UseShellExecute = true; psi.ErrorDialog = true; psi.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory; psi.FileName = "LTE.MultiProcessController.exe"; psi.Arguments = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22} {23} {24} {25} {26} {27} {28} {29} {30} {31} {32}", cellInfo.SourceName, p.X, p.Y, 0, 0, p.Z, cellInfo.eNodeB, cellInfo.CI, cellInfo.Azimuth, cellInfo.Inclination, cellInfo.cellType, cellInfo.frequncy, cellInfo.EIRP, cellInfo.directCoefficient, cellInfo.reflectCoefficient, cellInfo.diffracteCoefficient, cellInfo.diffracteCoefficient, fromAngle, toAngle, dis, this.reflectionNum, this.diffractionNum, this.computeIndoor, this.threadNum, bidstext, this.sideSplitUnit, this.computeVSide, false, false, true, false, userId, taskName); try { pa.pro = Process.Start(psi); pa.pro.WaitForExit(); } catch (InvalidOperationException exception) { return(new Result(false, "多进程计算启动失败,原因: " + exception.Message)); } catch (Exception ee) { return(new Result(false, "多进程计算启动失败,原因: " + ee.Message)); } return(new Result(true)); }
// ref https://blog.csdn.net/s0rose/article/details/78831570 // 判断两线段是否相交 public bool IsIntersec(LTE.Geometric.Point p1, LTE.Geometric.Point p2, LTE.Geometric.Point p3, LTE.Geometric.Point p4) //判断两线段是否相交 { bool D = false; //快速排斥,以l1、l2为对角线的矩形必相交,否则两线段不相交 if (Math.Max(p1.X, p2.X) >= Math.Min(p3.X, p4.X) && //矩形1最右端大于矩形2最左端 Math.Max(p3.X, p4.X) >= Math.Min(p1.X, p2.X) && //矩形2最右端大于矩形最左端 Math.Max(p1.Y, p2.Y) >= Math.Min(p3.Y, p4.Y) && //矩形1最高端大于矩形最低端 Math.Max(p3.Y, p4.Y) >= Math.Min(p1.Y, p2.Y)) //矩形2最高端大于矩形最低端 { //若通过快速排斥则进行跨立实验 if (cross(p1, p2, p3) * cross(p1, p2, p4) <= 0 && cross(p3, p4, p1) * cross(p3, p4, p2) <= 0) { D = true; } else { D = false; } } else { D = false; } return(D); }
double Point2Line(LTE.Geometric.Point p0, LTE.Geometric.Point p1, LTE.Geometric.Point p2) { double den = distance(p1.Y, p2.Y, p1.X, p2.X); if (den < 0.00001) { return(0.0); } return(Math.Abs(xmult(p0, p1, p2) / den)); }
public double cross(LTE.Geometric.Point p1, LTE.Geometric.Point p2, LTE.Geometric.Point p3) //跨立实验 { double x1 = p2.X - p1.X; double y1 = p2.Y - p1.Y; double x2 = p3.X - p1.X; double y2 = p3.Y - p1.Y; return(x1 * y2 - x2 * y1); }
public Result parallelComputing(ref CellInfo cellInfo, double fromAngle, double toAngle, int eNodeB, int CI, ref List <ProcessArgs> paList, bool isReRay, bool isRecordReRay, bool isRayLoc, bool isRayAdj, int userID, string taskName) { string bidstext = "-1"; if (!this.ExistProcess(eNodeB, CI, ref paList)) { LTE.Geometric.Point p = cellInfo.SourcePoint; ProcessArgs pa = new ProcessArgs(); ProcessStartInfo psi = new ProcessStartInfo(); psi.UseShellExecute = true; psi.ErrorDialog = true; psi.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory; psi.FileName = "LTE.MultiProcessController.exe"; psi.Arguments = string.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19} {20} {21} {22} {23} {24} {25} {26} {27} {28} {29} {30} {31} {32}", cellInfo.SourceName, p.X, p.Y, 0, 0, p.Z, cellInfo.eNodeB, cellInfo.CI, cellInfo.Azimuth, cellInfo.Inclination, cellInfo.cellType, cellInfo.frequncy, cellInfo.EIRP, cellInfo.directCoefficient, cellInfo.reflectCoefficient, cellInfo.diffracteCoefficient, cellInfo.diffracteCoefficient, fromAngle, toAngle, this.distance, this.reflectionNum, this.diffractionNum, this.computeIndoor, this.threadNum, bidstext, this.diffPointsMargin, this.computeDiffrac, isReRay, isRecordReRay, isRayLoc, isRayAdj, userID, taskName); try { pa.pro = Process.Start(psi); paList.Add(pa); pa.pro.WaitForExit(); //----- 子进程入口 //子进程异常处理,防止父进程无限阻塞,Controller不能及时返回消息 if (pa.pro.ExitCode != 0) { return(new Result(false, "多进程计算失败,请重试,错误代码:" + pa.pro.ExitCode)); } } catch (InvalidOperationException exception) { return(new Result(false, "多进程计算启动失败,原因: " + exception.Message)); } catch (Exception ee) { return(new Result(false, "多进程计算启动失败,原因: " + ee.Message)); } } else { return(new Result(false, "该小区正在计算")); } return(new Result { ok = true, msg = "小区覆盖计算已提交", code = "1" }); }
///<summary> /// 将点转换为经纬度点 /// </summary> /// <param name="point">平面坐标点</param> ///<returns>经纬度点</returns> ///<remarks></remarks> public LTE.Geometric.Point GetGeoPoint(LTE.Geometric.Point point) { lock (syncGeo) { double[] p = new double[2]; p[0] = point.X; p[1] = point.Y; ICoordinateTransformation trans = pCTFAC.CreateFromCoordinateSystems(pPCS, pGCS); p = trans.MathTransform.Transform(p); point.X = p[0]; point.Y = p[1]; } return(point); }
// 判断点p3和p4构成的线段是否和res_Points中的点构成的线段发生交叉 // 例如: res_Pints=[p_0,p_1,p_2,p_3] 一共4个点 // 则本函数判断 (p3,p4) 构成的线段是否和 (p_0,p_1),(p_1,p_2),(p_2,p_3)这3条线段发生线段交叉 public bool checkValid(LTE.Geometric.Point p3, LTE.Geometric.Point p4, List <LTE.Geometric.Point> res_Points, int n) { if (samePt(p4, res_Points[0])) { return(true); } for (int idx = 0; idx < n - 2; ++idx) { if (IsIntersec(res_Points[idx], res_Points[idx + 1], p3, p4)) { return(false); } } return(true); }
// 去掉被遮挡的面 2019.1.2 public HashSet <int> getPolygonsID(Vector3 top, ref List <Polygon> polygons) { List <int> buildingids = new List <int>(); for (int i = 0; i < polygons.Count; i++) { if (!polygons[i].m_ground) { buildingids.Add(polygons[i].m_buildingID); } } LTE.Geometric.Point source = new LTE.Geometric.Point(top.x, top.y, top.z); Dictionary <int, LTE.InternalInterference.Grid.TriangleBound> dic = LTE.InternalInterference.Grid.BuildingGrid3D.getShelterDisAndAngleBeam(source, buildingids, 0); HashSet <int> ret = new HashSet <int>(dic.Keys.ToList()); return(ret); }
// 强弱相间点、强点用到 private void strongWeakPt() { Pt.Clear(); for (int j = 1; j < n; j++) { if (gx[j] < leftBound || gx[j] > rightBound || gy[j] < downBound || gy[j] > upBound) { continue; } if (gx[j - 1] < leftBound || gx[j - 1] > rightBound || gy[j - 1] < downBound || gy[j - 1] > upBound) { continue; } if (pwrDbm[j] - pwrDbm[j - 1] > 15 && pwrDbm[j] - pwrDbm[j - 1] < 25 && (Math.Abs(gx[j - 1] - gx[j]) < 50 && Math.Abs(gy[j - 1] - gy[j]) < 50)) { // 拉大距离 int k = j; LTE.Geometric.Point pt = new LTE.Geometric.Point(gx[k], gy[k], 0); LTE.Geometric.Point pt1 = new LTE.Geometric.Point(gx[j - 1], gy[j - 1], 0); StrongWeakPt p = new StrongWeakPt(ref pt1, ref pt, Math.Abs(pwrDbm[k] - pwrDbm[j - 1])); p.strongPower = pwrDbm[j]; Pt.Add(p); } else if (pwrDbm[j - 1] - pwrDbm[j] > 15 && pwrDbm[j - 1] - pwrDbm[j] < 25 && (Math.Abs(gx[j - 1] - gx[j]) < 100 && Math.Abs(gy[j - 1] - gy[j]) < 100)) { int k = j; LTE.Geometric.Point pt = new LTE.Geometric.Point(gx[j - 1], gy[j - 1], 0); LTE.Geometric.Point pt1 = new LTE.Geometric.Point(gx[k], gy[k], 0); StrongWeakPt p = new StrongWeakPt(ref pt1, ref pt, Math.Abs(pwrDbm[k] - pwrDbm[j - 1])); p.strongPower = pwrDbm[j - 1]; Pt.Add(p); } } }
public Result parallelComputing(ref CellInfo cellInfo, double fromAngle, double toAngle, bool isRayLoc, bool isRayAdj) { int processNum = this.threadNum; Random r = new Random(DateTime.Now.Second); LTE.Geometric.Point p = cellInfo.SourcePoint; double deltaA = (toAngle - fromAngle + 360) % 360 / processNum; double from, to; List <int> bids = new List <int>(); for (int i = 0; i < processNum; i++) { from = (fromAngle + i * deltaA + 360) % 360; to = (fromAngle + (i + 1) * deltaA + 360) % 360; if (to > toAngle) { to = toAngle; } Calc calc = new Calc(ref cellInfo, this.distance, from, to, this.reflectionNum, this.diffractionNum, this.computeIndoor, this.diffPointsMargin, bids, isRayLoc, isRayAdj); calc.start(); } return(new Result(true)); }
private void strongWeakPt2() { Pt2.Clear(); double d = -49; while (Pt2.Count < 20) { for (int j = 1; j < n; j++) { if (pwrDbm[j] > d) { // 拉大距离 int k = j; LTE.Geometric.Point pt = new LTE.Geometric.Point(gx[k], gy[k], 0); LTE.Geometric.Point pt1 = new LTE.Geometric.Point(gx[j - 1], gy[j - 1], 0); StrongWeakPt p = new StrongWeakPt(ref pt1, ref pt, Math.Abs(pwrDbm[k] - pwrDbm[j - 1])); p.strongPower = pwrDbm[j]; Pt2.Add(p); } } d--; } }
double constraint_low_bound = 0.02; // 策略3的控制参数 //public Result smoothBuildingPoints() //{ // IbatisHelper.ExecuteDelete("DeleteBuildingVertex", null); // DataTable dt = new DataTable(); // dt.Columns.Add("BuildingID", System.Type.GetType("System.Int32")); // dt.Columns.Add("VertexLong", System.Type.GetType("System.Double")); // dt.Columns.Add("VertexLat", System.Type.GetType("System.Double")); // dt.Columns.Add("VertexX", System.Type.GetType("System.Double")); // dt.Columns.Add("VertexY", System.Type.GetType("System.Double")); // dt.Columns.Add("VIndex", System.Type.GetType("System.Int16")); // Hashtable ht = new Hashtable(); // int pageindex = 0; // int pagesize = 10000; // ht["pageindex"] = pageindex; // ht["pagesize"] = pagesize; // BuildingGrid3D.constructBuildingVertexOriginalByBatch(pageParam: ht); // while (BuildingGrid3D.buildingVertexOriginal.Count > 0) // { // int minBid, maxBid; // BuildingGrid3D.getAllBuildingIDRange(out minBid, out maxBid); // for (int i = minBid; i <= maxBid; i++) // { // List<LTE.Geometric.Point> bpoints = BuildingGrid3D.getBuildingVertexOriginal(i); // List<LTE.Geometric.Point> ps = Process(ref bpoints); // 2018-05-08 // if (ps.Count < 20) // ps = bpoints; // for (int j = 0; j < ps.Count; j++) // { // //使用proj.net库转换坐标,by JinHaijia // LTE.Geometric.Point pCopy=new LTE.Geometric.Point(ps[j]); // pCopy = LTE.Utils.PointConvertByProj.Instance.GetGeoPoint(pCopy); // //旧版使用arcgis接口转换坐标 // //ESRI.ArcGIS.Geometry.IPoint p = GeometryUtilities.ConstructPoint2D(ps[j].X, ps[j].Y); // //PointConvert.Instance.GetGeoPoint(p); // //System.Diagnostics.Debug.WriteLine("transfNew long:" + pCopy.X + " latitude:" + pCopy.Y); // //System.Diagnostics.Debug.WriteLine("transfOld long:" + p.X + " latitude:" + p.Y); // //System.Diagnostics.Debug.WriteLine("_________"); // DataRow dr = dt.NewRow(); // dr["BuildingID"] = i; // dr["VertexLong"] = pCopy.X; // dr["VertexLat"] = pCopy.Y; // dr["VertexX"] = ps[j].X; // dr["VertexY"] = ps[j].Y; // dr["VIndex"] = j; // dt.Rows.Add(dr); // } // if (dt.Rows.Count >= 5000) // { // DataUtil.BCPDataTableImport(dt, "tbBuildingVertex"); // dt.Clear(); // } // } // DataUtil.BCPDataTableImport(dt, "tbBuildingVertex"); // dt.Clear(); // BuildingGrid3D.clearBuildingVertexOriginal(); // ht["pageindex"] = ++pageindex; // BuildingGrid3D.constructBuildingVertexOriginalByBatch(pageParam: ht); // } // return new Result(true,"建筑物顶点平滑完成"); //} public Result smoothBuildingPoints() { BuildingGrid3D.constructBuildingVertexOriginal(); int minBid, maxBid; BuildingGrid3D.getAllBuildingIDRange(out minBid, out maxBid); DataTable dt = new DataTable(); dt.Columns.Add("BuildingID", System.Type.GetType("System.Int32")); dt.Columns.Add("VertexLong", System.Type.GetType("System.Double")); dt.Columns.Add("VertexLat", System.Type.GetType("System.Double")); dt.Columns.Add("VertexX", System.Type.GetType("System.Double")); dt.Columns.Add("VertexY", System.Type.GetType("System.Double")); dt.Columns.Add("VIndex", System.Type.GetType("System.Int16")); try { IbatisHelper.ExecuteDelete("DeleteBuildingVertex", null); } catch (Exception e) { return(new Result(false, e.ToString())); } for (int i = minBid; i <= maxBid; i++) { List <LTE.Geometric.Point> bpoints = BuildingGrid3D.getBuildingVertexOriginal(i); List <LTE.Geometric.Point> ps = Process(ref bpoints); // 2018-05-08 if (ps.Count < 20) { ps = bpoints; } for (int j = 0; j < ps.Count; j++) { LTE.Geometric.Point p = new Geometric.Point(ps[j].X, ps[j].Y, 0); LTE.Geometric.Point pCopy = new LTE.Geometric.Point(ps[j]); p = LTE.Utils.PointConvertByProj.Instance.GetGeoPoint(p); DataRow dr = dt.NewRow(); dr["BuildingID"] = i; dr["VertexLong"] = p.X; dr["VertexLat"] = p.Y; dr["VertexX"] = ps[j].X; dr["VertexY"] = ps[j].Y; dr["VIndex"] = j; dt.Rows.Add(dr); } if (dt.Rows.Count >= 5000) { DataUtil.BCPDataTableImport(dt, "tbBuildingVertex"); dt.Clear(); } } DataUtil.BCPDataTableImport(dt, "tbBuildingVertex"); dt.Clear(); BuildingGrid3D.clearBuildingVertexOriginal(); return(new Result(true)); }
double xmult(LTE.Geometric.Point p1, LTE.Geometric.Point p2, LTE.Geometric.Point p0) { return((p1.X - p0.X) * (p2.Y - p0.Y) - (p2.X - p0.X) * (p1.Y - p0.Y)); }
bool samePt(LTE.Geometric.Point p1, LTE.Geometric.Point p2) { return(Math.Abs(p1.X - p2.X) <= 0.00000001 && Math.Abs(p1.Y - p2.Y) <= 0.00000001); }
public StrongWeakPt(ref LTE.Geometric.Point w, ref LTE.Geometric.Point s, double d) { this.weak = w; this.strong = s; this.diff = d; }