public void Dragging(LocationProbe probe)
 {
     if (rbHorizon.Checked)
     {
         UpdateHorizon(probe);
     }
 }
 public void StopDragging(LocationProbe probe)
 {
     if (rbLightcurve.Checked)
     {
         UpdateLightCurve(probe);
     }
 }
 private Point?GetRequest(LocationProbe probe)
 {
     lock (_requestProbe)
     {
         var index = _requestProbe.IndexOf(probe);
         return(index < 0 ? null : (Point?)_requestPoint[index]);
     }
 }
        public LocationProbe NewLocationProbe()
        {
            var probe = new LocationProbe {
                Color = AllocateColor(), Text = "<Click on probe location in map>"
            };

            Add(probe);
            return(probe);
        }
 private void DeleteRequeest(LocationProbe probe)
 {
     lock (_requestProbe)
     {
         var index = _requestProbe.IndexOf(probe);
         if (index >= 0)
         {
             _requestProbe.RemoveAt(index);
             _requestPoint.RemoveAt(index);
         }
     }
 }
 private void UpdateHorizon(LocationProbe probe)
 {
     AddRequest(probe);
     if (_updateHorizonTask != null)
     {
         return;
     }
     _updateHorizonTask = Task.Run(() =>
     {
         restart:
         Point? id;
         while ((id = GetRequestedId(probe)).HasValue && !LunarHorizon.Singleton.PatchCache.ContainsKey(id.Value))
         {
             LunarHorizon.Singleton.GetPatch(id.Value);
         }
         if (!id.HasValue)
         {
             return;
         }
         var patch = LunarHorizon.Singleton.GetPatch(id.Value);
         if (patch == null)
         {
             return;
         }
         var loc = GetRequest(probe);
         if (!loc.HasValue)
         {
             return;
         }
         var pt = new Point(loc.Value.X - patch.Id.X * TerrainPatch.DefaultSize, loc.Value.Y - patch.Id.Y * TerrainPatch.DefaultSize);
         if (pt.X < 0 || pt.X >= TerrainPatch.DefaultSize || pt.Y < 0 || pt.Y >= TerrainPatch.DefaultSize)
         {
             goto restart;
         }
         var horizon = patch.GetHorizon(pt.Y, pt.X);
         lock (_horizonCache)
         {
             _horizonCache[probe] = GetHorizonCurve(horizon, probe.Color);
             _sunCache[probe]     = GetSunCurve(patch, pt, LunarHorizon.Singleton.MapView.SunVector, probe.Color);
         }
         var loc2 = GetRequest(probe);
         if (loc2.HasValue && loc2.Value != loc.Value)
         {
             goto restart;
         }
         _updateHorizonTask = null;
         UpdatePlots();
     });
 }
 private void UpdateLightCurve(LocationProbe probe)
 {
     lock (this)
     {
         if (_lightCurveGenerator == null)
         {
             _lightCurveGenerator = new LightCurveApprox();
         }
         var pt     = probe.Location.ToPoint();
         var points = _lightCurveGenerator.GetLightCurve(pt.Y, pt.X, new DateTime(2028, 1, 1), new DateTime(2029, 1, 1), new TimeSpan(2, 0, 0));
         var curve  = new LineItem(null, points, probe.Color, SymbolType.None);
         _lightCurveCache[probe] = curve;
     }
     UpdatePlots();
 }
        public void Add(LocationProbe probe)
        {
            var item = new ListViewItem {
                Text = probe.Text, Tag = probe, BackColor = probe.Color
            };

            lvProbes.Items.Add(item);
            if (!(Layer is LocationProbeMapLayer layer))
            {
                return;
            }
            layer.Probes.Add(probe);
            if (layer == LunarHorizon.Singleton.GetSelectedLayer())
            {
                LunarHorizon.Singleton.MapView.Invalidate();
            }
        }
 private void AddRequest(LocationProbe probe)
 {
     lock (_requestProbe)
     {
         var pt    = new Point((int)probe.Location.X, (int)probe.Location.Y);
         var index = _requestProbe.IndexOf(probe);
         if (index < 0)
         {
             _requestProbe.Add(probe);
             _requestPoint.Add(pt);
         }
         else
         {
             _requestPoint[index] = pt;
         }
     }
 }
        private Point?GetRequestedId(LocationProbe probe)
        {
            var pt = GetRequest(probe);

            return(pt.HasValue ? (Point?)TerrainPatch.LineSampleToId(pt.Value) : null);
        }