// с такими вариантом получается пофиг точки или запятые в числах:
double radius = Convert.ToDouble("100".Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture); // радиус в километрах задаем
double origin_y = Convert.ToDouble("88,820525".Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture); // задаем координаты широты
double origin_x = Convert.ToDouble("179.319500".Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture); // задаем координаты долготы
// Считаем сколько градусов в наших километрах:
double Lat = origin_y;
double Long = origin_x;
GeoCoordinate geo2;
GeoCoordinate geo3;
GeoCoordinate geo1 = new GeoCoordinate(Lat,Long); // координаты нашей изначальной точки
if (Lat<89) {
geo2 = new GeoCoordinate(Lat+1,Long); // координаты соседней точки с разницей в 1 градус широты
}
else {
geo2 = new GeoCoordinate(Lat-1,Long); // координаты соседней точки с разницей в 1 градус широты, но если они выходят за пределы 90 градусов, то считаем в обратную сторону
}
double distanceTo = geo1.GetDistanceTo(geo2);
double km_im_Lat = distanceTo / 1000; // (км/градус) столько километров 1 градусе широты в этом районе.
if (Long<179) {
geo3 = new GeoCoordinate(Lat,Long+1); // координаты соседней точки с разницей в 1 градус долготы
}
else {
geo3 = new GeoCoordinate(Lat,Long-1); // координаты соседней точки с разницей в 1 градус долготы
}
distanceTo = geo1.GetDistanceTo(geo3);
double km_im_Long = distanceTo / 1000; // (км/градус) столько километров 1 градусе долготы.
project.SendInfoToLog(km_im_Lat.ToString() + " " + km_im_Long.ToString() + " - столько километров 1 градусе широты и долготы в этом районе", false);
double kv_Shirina__km_im_Long_d = radius / km_im_Long; // (градусы) половина ширины нашего эллипса в градусах (если смотреть с точки зрения градусов а не километров, то это эллипс)
double kv_Visota__km_im_Lat_d = radius / km_im_Lat; // (градусы) половина высоты нашего эллипса
// строим прямоугольник вокруг нашего эллипса, но с запасом в 2 раза:
double origin_x_max = origin_x + (kv_Shirina__km_im_Long_d*2);
if (origin_x_max>180) origin_x_max=180;
double origin_x_min = origin_x - (kv_Shirina__km_im_Long_d*2);
if (origin_x_min<-180) origin_x_min=-180;
double origin_y_max = origin_y + (kv_Visota__km_im_Lat_d*2);
if (origin_y_max>90) origin_y_max=90;
double origin_y_min = origin_y - (kv_Visota__km_im_Lat_d*2);
if (origin_y_min<-90) origin_y_min=-90;
// Дальше в цикле ставим рандомные точки в пределах прямоугольника и проверяем попали ли мы в наш эллипс:
Random random = new Random();
for (int i = 0; i<900; i++) {
double x_new = random.NextDouble() * (origin_x_max - origin_x_min) + origin_x_min;
x_new = Math.Round(x_new, 6); //округляем до 6 знаков после запятой
double y_new = random.NextDouble() * (origin_y_max - origin_y_min) + origin_y_min;
y_new = Math.Round(y_new, 6); //округляем до 6 знаков после запятой
GeoCoordinate geo_new = new GeoCoordinate(y_new,x_new); // координаты случайной точки в пределах нашего прямоугольника
distanceTo = geo1.GetDistanceTo(geo_new); // расстояние в метрах от нашей старой точки до новой рандомной
if (distanceTo/1000 <= radius) {
project.Variables["y"].Value = y_new.ToString();
project.Variables["x"].Value = x_new.ToString();
project.SendInfoToLog(y_new.ToString() + " " + x_new.ToString() + " - это случайные координаты в пределах нашего прямоугольника, они подошли по радиусу", false);
return "ура, нашли нашу точку, которая подходит всем условиям";
}
else {
project.SendInfoToLog(y_new.ToString() + " " + x_new.ToString() + " - это случайные координаты в пределах нашего прямоугольника, но они НЕ подошли по радиусу", false);
}
}