## 3 Coverage Prediction Tool
### Ray-Launching Algorithm  
The floor plan is discretized into a finite set of grid points, and at every grid point, we calculate the received power, given a certain access point configuration. For each grid point, we launch rays from the access point in both azimuth (\(360^{\circ}\)) and elevation (\(180^{\circ}\)) planes with a predefined angle increment, and determine the interactions with the environment. An accurate description of the environment and material characteristics is required for the calculation of reflection and transmission losses. An object is characterized by its relative permittivity, and the loss is calculated via Fresnel reflection and transmission coefficients. A lookup table with reflection and transmission losses for a broad set of materials and incidence angles is implemented, for materials for which the permittivity is not defined. The loss values in the lookup table are taken from [62]. The path information of the best paths is stored, including path loss, total distance, and interactions. The ray-launching algorithm is presented in Figure 4.  
For each ray, we first verify whether the ray hits the considered grid point, i.e., whether there is a direct path between the launch point of the ray and the receiver following the considered azimuth and elevation angles. If a direct path exists and is not obstructed, we add it to the path vector. If a direct path exists but is obstructed, we distinguish between an object and human body blockage. Blockage by a human body is modeled via a double knife-edge diffraction (KED) [63]. If an object blocks the direct path, we calculate the transmission loss and add the path information to the path vector. We also consider reflection on the object or body. If no direct ray hits the grid point, we define the next object interaction and calculate the angles of the reflected ray, in both azimuth and elevation fields. Based on the incidence angle, we calculate the reflection losses and add it to the PL of the considered path up to the reflection point. If the total PL does not exceed the maximum PL and the maximum number of interactions are not reached, we perform the same analysis for the departed ray, i.e., verify whether the reflected ray hits the grid point. When the receiver is reached, when the total PL exceeds the maximum PL threshold, or when the number of  
Figure 4: Flowchart presentation of ray-launching algorithm, with elevation angle \(\phi\), azimuth angle \(\theta\), and elevation and azimuth increment \(\Delta\phi\), \(\Delta\theta\).  
interactions reaches its threshold, the next ray is launched from the access point location. We use a receiver margin, i.e., we consider that the receiver is reached when a ray is within a certain distance of the receiver location. The simulation settings are presented in Section 3.4.  
The result of the ray-launching algorithm is a path information matrix for every grid point, that contains PL, distance, AoA, AoD, and coordinates for all object interactions of every path between the access point location and grid point. From this matrix, we have the option to investigate omnidirectional PL by summing the received powers from the different MPCs, or to select the path with minimum PL, which makes it more realistic for real network deployments.  
We consider an omnidirectional TX antenna, which corresponds to the measurement equipment presented in Section 2.1.1 and is similar to previous work [61]. However, as practical mmWave wireless systems need directional antennas to overcome the high free space PL, we also add antenna directivity to the coverage prediction tool. For this implementation, we need the antenna gain in dBi as a function of azimuth and elevation.