/// <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); }
/// <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); }