You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel.ML/LocationMath/Geometry.cs

56 lines
2.1 KiB

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;
}
}
}

Powered by TurnKey Linux.