private void S57Control_PaintOverlaysEvent(object sender, Graphics gr)
{
// Initialize usvTrail if not already done
if (usvTrail == null)
{
usvTrail = new List<Tuple<GeoCoordinate,double>>();
}
// USV Position
if (DataRead._USVGeoCoordinate != null)
{
usvPixelPoint = m_draw.GeoPix.Point(new GeoPoint
{
Lat = DataRead._USVGeoCoordinate.Latitude,
Lon = DataRead._USVGeoCoordinate.Longitude
});
//var usvGeoPoint = m_draw.GeoPix.GeoPointFromPixelPoint(usvPixelPoint);
if (m_draw.GeoPix.PointInView || !m_draw.GeoPix.PointInView)
{
var currentusvGeocordinate = new GeoCoordinate(DataRead._USVGeoCoordinate.Latitude, DataRead._USVGeoCoordinate.Longitude);
if (usvTrail.Count > 0)
{
lastPosition = usvTrail[usvTrail.Count - 1].Item1;
lastPositionAngle = usvTrail[usvTrail.Count - 1].Item2;
float distance = DataRead.DistanceBetweenPoints(lastPosition, currentusvGeocordinate);
if (distance >= 10)
{
usvTrail.Add(new Tuple<GeoCoordinate, double>(currentusvGeocordinate, DataRead.USV_Angle));
}
}
else
{
usvTrail.Add(new Tuple<GeoCoordinate, double>(currentusvGeocordinate, DataRead.USV_Angle));
}
if (DataRead._USVGeoCoordinate != null)
{
//Draw the USV at the current position
usvRectangle = new Rectangle(Convert.ToInt32(usvPixelPoint.X - 14),
Convert.ToInt32(usvPixelPoint.Y - 14), 30, 30);
}
//Draw Circle around USV
Color transparentOrange = Color.FromArgb(50, Color.DarkOrange);
var usvPixelPerMeters = m_draw.PixelSizeMetres * m_draw.GeoPix.DisplayScale;
int radius = (int)(600 / (2 * Math.PI) / usvPixelPerMeters);
using (Brush brush = new SolidBrush(transparentOrange))
{
gr.FillEllipse(brush, usvPixelPoint.X - radius, usvPixelPoint.Y - radius, radius * 2, radius * 2);
}
Font distFont = new Font("Calibri", 11,FontStyle.Bold);
Brush textBrush = Brushes.Black;
PointF topPoint = new PointF(usvPixelPoint.X - 30, usvPixelPoint.Y - radius - 15);
gr.DrawString("Safe Zone", distFont, textBrush, topPoint);
if (_rotatechartbuttonChecked)
{
m_draw.SetDirectionOfUp(DataRead.USV_Angle, _defaultPixelPoint);
//Draw USVImage
Bitmap rotatedImage = RotateImage(_usvImage, 0);
gr.DrawImage(rotatedImage, usvRectangle);
gr.SmoothingMode = SmoothingMode.AntiAlias;
//Draw trail
foreach (var point in usvTrail)
{
var trailPixelPoint = m_draw.GeoPix.Point(new GeoPoint
{
Lat = point.Item1.Latitude,
Lon = point.Item1.Longitude
});
trailRectangle = new Rectangle(Convert.ToInt32(trailPixelPoint.X), Convert.ToInt32(trailPixelPoint.Y), 10, 10);
RotateRectangle(gr, trailRectangle, point.Item2 - DataRead.USV_Angle);
if (point.Item2 >= 0 && point.Item2 < 90)
{
gr.DrawRectangle(Pens.Black, trailRectangle.X - 3, trailRectangle.Y, 3, 10);
}
else if (point.Item2 >= 90 && point.Item2 < 180)
{
gr.DrawRectangle(Pens.Black, trailRectangle.X, trailRectangle.Y + 7, 3, 10);
}
else if (point.Item2 >= 180 && point.Item2 <= 270)
{
gr.DrawRectangle(Pens.Black, trailRectangle.X + 7, trailRectangle.Y, 3, 10);
}
else if (point.Item2 > 270 && point.Item2 < 360)
{
gr.DrawRectangle(Pens.Black, trailRectangle.X, trailRectangle.Y, 3, 10);
}
}
gr.SmoothingMode = SmoothingMode.Default;
}
else if (!_rotatechartbuttonChecked)
{
m_draw.SetDirectionOfUp(0, _defaultPixelPoint);
//Draw USVImage
Bitmap rotatedImage = RotateImage(_usvImage, DataRead.USV_Angle);
gr.DrawImage(rotatedImage, usvRectangle);
gr.SmoothingMode = SmoothingMode.AntiAlias;
// Draw trail
foreach (var point in usvTrail)
{
var trailPixelPoint = m_draw.GeoPix.Point(new GeoPoint
{
Lat = point.Item1.Latitude,
Lon = point.Item1.Longitude
});
trailRectangle = new Rectangle(Convert.ToInt32(trailPixelPoint.X), Convert.ToInt32(trailPixelPoint.Y), 10, 10);
RotateRectangle(gr, trailRectangle, point.Item2);
if (point.Item2 >= 0 && point.Item2 < 90)
{
gr.DrawRectangle(Pens.Black, trailRectangle.X - 3, trailRectangle.Y, 3, 10);
}
else if (point.Item2 >= 90 && point.Item2 < 180)
{
gr.DrawRectangle(Pens.Black, trailRectangle.X, trailRectangle.Y + 7, 3, 10);
}
else if (point.Item2 >= 180 && point.Item2 <= 270)
{
gr.DrawRectangle(Pens.Black, trailRectangle.X + 7, trailRectangle.Y, 3, 10);
}
else if (point.Item2 > 270 && point.Item2 < 360)
{
gr.DrawRectangle(Pens.Black, trailRectangle.X, trailRectangle.Y, 3, 10);
}
}
gr.SmoothingMode = SmoothingMode.Default;
}
//Draw AIS
if (windowsUIButtonPanel4.Buttons["AIS"].Properties.Checked)
{
DrawAis(gr);
}
// Draw RangeBar
//var futureDistance = DataRead.USV_SOG * mpsToKmPerHour * 1 * MinToHour; // distance in nautical miles for 1 minute
//var futurePoint = DataRead.FindPointAtDistanceFrom(
// currentusvGeocordinate,
// DataRead.ToRad(DataRead.USV_Angle),
// futureDistance);
//var futureDistancePixelPoint = m_draw.GeoPix.Point(new GeoPoint { Lat = futurePoint.Latitude, Lon = futurePoint.Longitude });
//var futureGeopoint = m_draw.GeoPix.GeoPointFromPixelPoint(futureDistancePixelPoint);
//gr.SmoothingMode = SmoothingMode.AntiAlias;
//using (var rangeBarPen = new Pen(Color.Black, 3))
//{
// gr.DrawLine(rangeBarPen, (int)usvGeoPoint.Lat, (int)usvGeoPoint.Lon, (int)futureGeopoint.Lat, (int)futureGeopoint.Lon);
//}
//gr.SmoothingMode = SmoothingMode.Default;
}
}
S57Control1.Invalidate();
}
private void DrawAis(Graphics gr)
{
//AIS Position
if (aisTrail == null) //Initialize usvTrail if not already done
{
aisTrail = new List<Tuple<double,GeoCoordinate>>();
}
if (DataRead._AISGeoCoordinate != null)
{
aisPixelPoint = m_draw.GeoPix.Point(new GeoPoint
{
Lat = DataRead._AISGeoCoordinate.Latitude,
Lon = DataRead._AISGeoCoordinate.Longitude
});
//var usvGeoPoint = m_draw.GeoPix.GeoPointFromPixelPoint(usvPixelPoint);
if (m_draw.GeoPix.PointInView || !m_draw.GeoPix.PointInView)
{
var currentaisGeocordinate = new GeoCoordinate(DataRead._AISGeoCoordinate.Latitude,
DataRead._AISGeoCoordinate.Longitude);
if (aisTrail.Count > 0)
{
lastaisPosition = aisTrail[aisTrail.Count - 1].Item2;
lastaisPositionAngle = aisTrail[aisTrail.Count - 1].Item1;
float aisdistance = DataRead.DistanceBetweenPoints(lastaisPosition, currentaisGeocordinate);
if (aisdistance >= 10)
{
aisTrail.Add(new Tuple<double, GeoCoordinate>(DataRead.AIS_Angle,currentaisGeocordinate));
}
}
else
{
aisTrail.Add(new Tuple<double, GeoCoordinate>(DataRead.AIS_Angle, currentaisGeocordinate));
}
if (DataRead._AISGeoCoordinate != null)
{
//Draw the USV at the current position
aisRectangle = new Rectangle(Convert.ToInt32(aisPixelPoint.X - 14),
Convert.ToInt32(aisPixelPoint.Y - 14), 30, 30);
}
//Draw AIS Image
Bitmap rotatedAISImage = RotateImage(_aisImage, DataRead.AIS_Angle);
gr.DrawImage(rotatedAISImage, aisRectangle);
gr.SmoothingMode = SmoothingMode.AntiAlias;
// Draw trail
foreach (var aispoint in aisTrail)
{
var trailaisPixelPoint = m_draw.GeoPix.Point(new GeoPoint
{
Lat = aispoint.Item2.Latitude,
Lon = aispoint.Item2.Longitude
});
trailaisRectangle = new Rectangle(Convert.ToInt32(trailaisPixelPoint.X),
Convert.ToInt32(trailaisPixelPoint.Y), 10, 10);
RotateRectangle(gr, trailaisRectangle, aispoint.Item1);
if (aispoint.Item1 >= 0 && aispoint.Item1 < 90)
{
gr.DrawRectangle(Pens.Black, trailaisRectangle.X - 3, trailaisRectangle.Y, 3, 10);
}
else if (aispoint.Item1 >= 90 && aispoint.Item1 < 180)
{
gr.DrawRectangle(Pens.Black, trailaisRectangle.X, trailaisRectangle.Y + 7, 3, 10);
}
else if (aispoint.Item1 >= 180 && aispoint.Item1 <= 270)
{
gr.DrawRectangle(Pens.Black, trailaisRectangle.X + 7, trailaisRectangle.Y, 3, 10);
}
else if (aispoint.Item1 > 270 && aispoint.Item1 < 360)
{
gr.DrawRectangle(Pens.Black, trailaisRectangle.X, trailaisRectangle.Y, 3, 10);
}
}
gr.SmoothingMode = SmoothingMode.Default;
}
}
}
here in this code i am drawing two images usv and ais. but when i am changing the angle of usv and speed of usv its effecting the drawing of ais image so i dont want call drawais(gr) inside that paintoverlay event any other way i can call that method somewhere?