//对轨迹中所有射线段的转角赋值
 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;
                    }
                }
            }
        }
Esempio n. 3
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);
        }