/// <summary> /// Calculate the visual magintude from a viewpoint. /// </summary> /// <param name="viewpoint">Viewpoint</param> /// <param name="losMap">LOS map</param> private void CalculateVisualMagnitude(SpatialUtils.ViewpointProps viewpoint, GeoMap losMap) { double visualMagnitude; spatialUtils.Viewpoint = viewpoint; viewpoint.Elevation = elevationMap[viewpoint.Y, viewpoint.X] + viewpoint.ElevationOffset; losMap[viewpoint.Y, viewpoint.X] = GeoMap.UndefinedValue; //initialize LOS of the viewpoint //find out the maximum distance to the edge of map int maxDistance = GetMaximumDistance(viewpoint); for (int i = 1 + omittedRings; i < maxDistance; i++) { GeoMap.Ring ring = elevationMap.GetRing(viewpoint.Y, viewpoint.X, i); foreach (int[] item in ring) { if (spatialUtils.IsCellVisible(losMap, item[0], item[1])) { visualMagnitude = spatialUtils.GetVisualMagnitude(item[0], item[1]); if (visualMagnitude > 0) { sumator.AddResult(new Sumator.VisualMagnitudeResult() { Y = item[0], X = item[1], VisualMagnitude = visualMagnitude, Weight = viewpoint.Weight }); } } } } }
/// <summary> /// Get the maximum distance from the viewpoint to the edge of the map. /// </summary> /// <param name="viewpoint">Viewpoint</param> /// <returns>Maximum distance from viewpoint to the edge</returns> private int GetMaximumDistance(SpatialUtils.ViewpointProps viewpoint) { int maxDistance = viewpoint.X; if (maxDistance < viewpoint.Y) { maxDistance = viewpoint.Y; } if (maxDistance < (elevationMap.GetLength(1) - viewpoint.X)) { maxDistance = elevationMap.GetLength(1) - viewpoint.X; } if (maxDistance < (elevationMap.GetLength(0) - viewpoint.Y)) { maxDistance = elevationMap.GetLength(0) - viewpoint.Y; } return(maxDistance); }
/// <summary> /// Add a new viewpoint to be calculated. /// </summary> /// <param name="viewpoint">Viewpoint</param> public void AddWork(SpatialUtils.ViewpointProps viewpoint) { workQueue.Enqueue(viewpoint); }