public List <GeoCoordinate> GenerateCoordinates() { List <GeoCoordinate> ret = new List <GeoCoordinate>() { HomeCoordinate }; double radius = MetricCircumFerence / (2 * Math.PI); double interval = 360.0 / NumberOfCoordinates; double startAngle = interval / 2; double centerAdditionalMetricLatitude = radius * Math.Sin(Common.DegreeToRadian(CircleDirection)); double centerAdditionalMetricLongitude = radius * Math.Cos(Common.DegreeToRadian(CircleDirection)); GeoCoordinate circleCenter = GeoCoordinate.AddMetricDistance(HomeCoordinate, centerAdditionalMetricLatitude, centerAdditionalMetricLongitude); for (int i = 0; i < (NumberOfCoordinates - 1); i++) { int angleMin = (int)(((CircleDirection + 180) + startAngle + (i * interval)) % 360); //int angleMax = (int)(((CircleDirection + 180) + startAngle + ((i + 1) * interval)) % 360); int randomAngle = angleMin + _random.Next(0, (int)interval); double metricLatitude = radius * Math.Sin(Common.DegreeToRadian(randomAngle)); double metricLongitude = radius * Math.Cos(Common.DegreeToRadian(randomAngle)); GeoCoordinate newPoint = GeoCoordinate.AddMetricDistance(circleCenter, metricLatitude, metricLongitude); ret.Add(newPoint); } return(ret); }
public List <GeoCoordinate> GenerateRandomCirclePoints() { List <GeoCoordinate> Points = new List <GeoCoordinate>(); int[] XValues = new int[NumberOfCoordinates]; int[] YValues = new int[NumberOfCoordinates]; int Radius = Convert.ToInt32(MetricRadius / (2 * Math.PI)); int DegreePerPoint = 360 / NumberOfCoordinates; Random random = new Random(); for (int i = 0; i < 100; i++) { random.Next(); } for (int i = 0; i < 4; i++) { for (int j = 0; j < (NumberOfCoordinates / 4); j++) { double DegreePointMinimum = j * DegreePerPoint; double DegreePointMaximum = (j + 1) * DegreePerPoint; double XMaximum = Math.Cos(DegreePointMinimum) * Radius; //double YMaximumAA = Math.Sin(DegreePointMaximum) * Radius; int XValue = random.Next(0, (int)XMaximum); double YMaximum; if (XValue > (int)(Math.Cos(DegreePointMaximum) * Radius)) { YMaximum = Math.Sin(DegreePointMaximum) * Radius; } else { YMaximum = Math.Tan(DegreePointMaximum) * XValue; } double YMinimum = Math.Tan(DegreePointMinimum) * XValue; int YValue = random.Next((int)YMinimum, (int)YMaximum); if (i == 1 || i == 2) { YValue = YValue * (-1); } if (i > 1) { XValue = XValue * (-1); } Points.Add(GeoCoordinate.AddMetricDistance(HomeCoordinate, YValue, XValue)); } } return(Points); }