/// <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);
        }
예제 #3
0
 /// <summary>
 /// Add a new viewpoint to be calculated.
 /// </summary>
 /// <param name="viewpoint">Viewpoint</param>
 public void AddWork(SpatialUtils.ViewpointProps viewpoint)
 {
     workQueue.Enqueue(viewpoint);
 }