//对轨迹中所有射线段的转角赋值 public void calcDefAngle(ref Dictionary <string, TrajInfo> rayDic) { foreach (string key in rayDic.Keys) { //遍历每个栅格 TrajInfo trajsOfGrid = rayDic[key]; // 遍历每个栅格内轨迹 foreach (int trajId in trajsOfGrid.traj.Keys) { RayInfo curTraj = trajsOfGrid.traj[trajId]; // 遍历每个轨迹的射线段 for (int j = 0; j < curTraj.rayList.Count; ++j) // 对于一条轨迹中的每条射线 { NodeInfo nodeCur = curTraj.rayList[j]; //当前射线段 if (j == 0) { nodeCur.DefAngle = -1;//如果是轨迹的第一条射线段,那么肯定是直射线,转角赋默认值-1 } else { NodeInfo nodeBef = curTraj.rayList[j - 1];//前一条射线段 NewVector3D vecBef = new NewVector3D(nodeBef.PointOfIncidence, nodeBef.CrossPoint); NewVector3D vecCur = new NewVector3D(nodeCur.PointOfIncidence, nodeCur.CrossPoint); double defAngle = vecBef.calcDefAngle(ref vecCur); nodeCur.DefAngle = defAngle; } } } } }
//对轨迹中所有射线段的转角赋值 public void filterGrids_withCondition(ref Dictionary <string, TrajInfo> rayDic, int GridsType) { // //GridsType: // -1 所有的多种混合 // 0 只包含直射; // 1 只包含反射轨迹; // 2 只包含绕射轨迹; if (-1 == GridsType) { foreach (string key in rayDic.Keys) { //遍历每个栅格 EA.GridsOfSpecialType[key] = 0; } } if (0 == GridsType) { foreach (string key in rayDic.Keys) { //遍历每个栅格 TrajInfo trajsOfGrid = rayDic[key]; Boolean isZhiShe = true; //判断只含直射 // 遍历每个栅格内轨迹 foreach (int trajId in trajsOfGrid.traj.Keys) { RayInfo curTraj = trajsOfGrid.traj[trajId]; // 遍历每个轨迹的射线段 for (int j = 0; j < curTraj.rayList.Count; ++j) // 对于一条轨迹中的每条射线 { NodeInfo nodeCur = curTraj.rayList[j]; //当前射线段 if (nodeCur.rayType == RayType.VReflection || nodeCur.rayType == RayType.HReflection) { isZhiShe = false; } else if (nodeCur.rayType == RayType.HDiffraction || nodeCur.rayType == RayType.VDiffraction) { isZhiShe = false; } } } if (isZhiShe) { EA.GridsOfSpecialType[key] = 0; } } } }
// key:"cellid,gxid,gyid" // value: TrajInfo{ key: "trajID", value: List<NodeInfo> } public static Dictionary <string, TrajInfo> buildingGrids(ref DataTable tb) { Dictionary <string, TrajInfo> rayDic = new Dictionary <string, TrajInfo>(); //DataTable tb = new DataTable(); //tb = IbatisHelper.ExecuteQueryForDataTable("getRays", null); double h = (int)GridHelper.getInstance().getGHeight(); if (tb.Rows.Count < 1) { return(rayDic); } else { for (int i = 0; i < tb.Rows.Count; i++) { int cellID = Convert.ToInt32(tb.Rows[i]["cellID"].ToString()); int Gxid = Convert.ToInt32(tb.Rows[i]["gxid"].ToString()); int Gyid = Convert.ToInt32(tb.Rows[i]["gyid"].ToString()); int trajID = Convert.ToInt32(tb.Rows[i]["trajID"].ToString()); double EmitPwrW = Convert.ToDouble(tb.Rows[i]["emitPwrW"].ToString()); int rayType = Convert.ToInt32(tb.Rows[i]["rayType"].ToString()); int rayLevel = Convert.ToInt32(tb.Rows[i]["rayLevel"].ToString()); double distance = Convert.ToDouble(tb.Rows[i]["distance"].ToString()); double Angle = Convert.ToDouble(tb.Rows[i]["angle"].ToString()); double attenuation = Convert.ToDouble(tb.Rows[i]["attenuation"].ToString()); double RecePwrW = Convert.ToDouble(tb.Rows[i]["recePwrW"].ToString()); string scen = tb.Rows[i]["proportion"].ToString(); int ptScen = Convert.ToInt32(tb.Rows[i]["endPointScen"].ToString()); RayType rayT = new RayType(); switch (rayType) { case 0: rayT = RayType.Direction; break; case 1: rayT = RayType.VReflection; break; case 2: rayT = RayType.HReflection; break; case 3: rayT = RayType.HDiffraction; break; case 4: rayT = RayType.VDiffraction; break; } NodeInfo ni = new NodeInfo(cellID, Gxid, Gyid, trajID, rayT, distance, Angle, attenuation, RecePwrW); // 射线经过各场景的距离 string[] scenArr = scen.Split(';'); int n = scenArr.Count(); ni.trajScen = new double[n]; for (int j = 0; j < n; j++) { ni.trajScen[j] = Convert.ToDouble(scenArr[j]) * distance; } ni.endPointScen = ptScen; string key = string.Format("{0},{1},{2}", cellID, Gxid, Gyid); if (rayDic.Keys.Contains(key)) // 存在 rayDic[key] { if (rayDic[key].traj.Keys.Contains(trajID)) // 存在 rayDic[key].traj[trajID] { rayDic[key].traj[trajID].rayList.Add(ni); if (EmitPwrW != 0) // 射线轨迹的第一段 { rayDic[key].traj[trajID].emitPwrW = EmitPwrW; } if (ni.recePwr != 0) // 射线轨迹的最后一段 { rayDic[key].traj[trajID].recePwrW = ni.recePwr; rayDic[key].sumReceivePwrW += ni.recePwr; } } else { RayInfo rays = new RayInfo(); rays.rayList.Add(ni); rayDic[key].traj[trajID] = rays; if (EmitPwrW != 0) // 射线轨迹的第一段 { rayDic[key].traj[trajID].emitPwrW = EmitPwrW; } if (ni.recePwr != 0) // 射线轨迹的最后一段 { rayDic[key].traj[trajID].recePwrW = ni.recePwr; rayDic[key].sumReceivePwrW += ni.recePwr; } } } else { RayInfo rays = new RayInfo(); rays.rayList.Add(ni); TrajInfo ti = new TrajInfo(); ti.traj[trajID] = rays; rayDic[key] = ti; if (EmitPwrW != 0) // 射线轨迹的第一段 { rayDic[key].traj[trajID].emitPwrW = EmitPwrW; } if (ni.recePwr != 0) // 射线轨迹的最后一段 { rayDic[key].traj[trajID].recePwrW = ni.recePwr; rayDic[key].sumReceivePwrW += ni.recePwr; } } } } foreach (string key in rayDic.Keys) { rayDic[key].sumPwrDbm = convertw2dbm(rayDic[key].sumReceivePwrW); } return(rayDic); }