示例#1
0
        /// <summary>
        ///全向静态发射射线
        /// </summary>
        /// <param name="currentNode">节点</param>
        /// <param name="ter">地形</param>
        /// <param name="rxBall">接收球</param>
        ///  <param name="cityBuilding">建筑物</param>
        ///  <param name="TessellationFrequency">细分点个数</param>
        ///  <param name="TxFrequencyBand">发射机频段信息</param>
        /// <returns></returns>
        private List <Path> LaunchRaysOmnidirectional(Node tx, ReceiveBall rxBall, Terrain ter, City cityBuilding, int TessellationFrequency, List <FrequencyBand> txFrequencyBand)
        {
            RayInfo directRay       = new RayInfo(tx.Position, rxBall.Receiver);
            Node    directCrossNode = directRay.GetCrossNodeWithTerrainRects(ter.lineRect(new RayInfo(rxBall.Receiver, new SpectVector(tx.Position, rxBall.Receiver))));

            if (directCrossNode != null && directCrossNode.DistanceToFrontNode < tx.Position.GetDistance(rxBall.Receiver))//若直射被阻挡
            {
                DirectCrossNode = directCrossNode;
            }
            List <Path>            pathInfo    = new List <Path>();
            List <RayTracingModel> originUnits = GetOriginUnitsOfIcosahedron(tx);

            this.HandleEachSurface(originUnits, pathInfo, tx, rxBall, ter, cityBuilding, TessellationFrequency, txFrequencyBand);
            return(pathInfo);
        }
示例#2
0
        /// <summary>
        ///获取所有射线的路径
        /// </summary>
        /// <param name="currentNode">节点</param>
        /// <param name="ter">地形</param>
        /// <param name="rxBall">接收球</param>
        ///  <param name="cityBuilding">建筑物</param>
        ///  <param name="firstN">初始细分点个数</param>
        ///  <param name="finalN">最终细分点个数</param>
        ///  <param name="TxFrequencyBand">发射机频段信息</param>
        /// <returns></returns>
        private List <Path> GetPunctiformRxPath(Node tx, ReceiveBall rxBall, Terrain ter, City cityBuilding, int firstN, int finalN, List <FrequencyBand> txFrequencyBand)
        {
            RayInfo directRay       = new RayInfo(tx.Position, rxBall.Receiver);
            Node    directCrossNode = directRay.GetCrossNodeWithTerrainRects(ter.lineRect(new RayInfo(rxBall.Receiver, new SpectVector(tx.Position, rxBall.Receiver))));

            if (directCrossNode != null && directCrossNode.DistanceToFrontNode < tx.Position.GetDistance(rxBall.Receiver))//若直射被阻挡
            {
                DirectCrossNode = directCrossNode;
            }
            List <Path>            pathInfo    = new List <Path>();
            List <RayTracingModel> originUnits = this.GetOriginUnitsOfIcosahedron(tx);  //正二十面体的二十个三角面
            double finalDivideAngle            = this.GetInitialAngleOfRayBeam(finalN); //最终细分角度,弧度制
            double firstDivideAngle            = this.GetInitialAngleOfRayBeam(firstN); //最初细分角度,弧度制

            for (int i = 0; i < originUnits.Count; i++)
            {
                List <RayTracingModel> firstUnits = this.GetInitialTrianglePath(tx, ter, rxBall, cityBuilding, originUnits[i], firstN, firstDivideAngle, txFrequencyBand);
                this.GetPathOfUnit(firstUnits, pathInfo, tx, ter, rxBall, cityBuilding, finalDivideAngle, txFrequencyBand);
            }

            return(pathInfo);
        }