|
|
|
|
using System;
|
|
|
|
|
using ZeroLevel.ML.Models;
|
|
|
|
|
|
|
|
|
|
namespace ZeroLevel.ML.LocationMath
|
|
|
|
|
{
|
|
|
|
|
public static class Geometry
|
|
|
|
|
{
|
|
|
|
|
public static Point2D GeoPointCoordinateInArea(GeoPoint point, GeoPoint[] corners)
|
|
|
|
|
{
|
|
|
|
|
var distanceToTLTR = Math.Abs(point.crossTrackDistanceTo(corners[0], corners[1]));
|
|
|
|
|
var distanceToTLBL = Math.Abs(point.crossTrackDistanceTo(corners[0], corners[3]));
|
|
|
|
|
|
|
|
|
|
var distanceTLTR = Math.Abs(corners[0].DistanceToPoint(corners[1]));
|
|
|
|
|
var distanceTLBL = Math.Abs(corners[0].DistanceToPoint(corners[3]));
|
|
|
|
|
|
|
|
|
|
return new Point2D(distanceToTLBL / distanceTLTR, distanceToTLTR / distanceTLBL);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static bool IsGeoPointInArea(GeoPoint point, GeoPoint[] corners)
|
|
|
|
|
{
|
|
|
|
|
var toTop = point.crossTrackDistanceTo(corners[0], corners[1]);
|
|
|
|
|
var toBottom = point.crossTrackDistanceTo(corners[3], corners[1]);
|
|
|
|
|
|
|
|
|
|
if (toTop < 0 && toBottom < 0) return false;
|
|
|
|
|
if (toTop > 0 && toBottom > 0) return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var toLeft = point.crossTrackDistanceTo(corners[3], corners[0]);
|
|
|
|
|
var toRight = point.crossTrackDistanceTo(corners[2], corners[1]);
|
|
|
|
|
|
|
|
|
|
if (toLeft < 0 && toRight < 0) return false;
|
|
|
|
|
if (toLeft > 0 && toRight > 0) return false;
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static bool IsPointInPolygon(GeoPoint[] poly, GeoPoint point)
|
|
|
|
|
{
|
|
|
|
|
int i, j;
|
|
|
|
|
bool c = false;
|
|
|
|
|
for (i = 0, j = poly.Length - 1; i < poly.Length; j = i++)
|
|
|
|
|
{
|
|
|
|
|
if ((((poly[i].Latitude <= point.Latitude) && (point.Latitude < poly[j].Latitude))
|
|
|
|
|
|| ((poly[j].Latitude <= point.Latitude) && (point.Latitude < poly[i].Latitude)))
|
|
|
|
|
&& (point.Longitude < (poly[j].Longitude - poly[i].Longitude) * (point.Latitude - poly[i].Latitude)
|
|
|
|
|
/ (poly[j].Latitude - poly[i].Latitude) + poly[i].Longitude))
|
|
|
|
|
{
|
|
|
|
|
c = !c;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return c;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|