Кто нибудь перепишет из php в си шарп кубик генерацию геопозиции от точки в радиусе

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
$radius = ?;
$origin_x = 5.420525;
$origin_y = 100.319500;

$angle = deg2rad(mt_rand(0, 359));
$pointRadius = mt_rand(0, $radius);

$point[] = array(
'x' => $origin_x + ($pointRadius * cos($angle)),
'y' => $origin_y + ($pointRadius * sin($angle))
);


тут в массив генерятся -- сделайте кто может чтобы просто получить координаты одной точки и положить в переменные проекта
 

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Ап. Если успею быстрее других - помогу. Пока что немного занят.
 

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Математика:
double radius = Double.Parse(project.Variables["radius"].Value); // Парсятся из запятой. Точка неверный инпут, тоесть в переменной должно быть "2,5"
double x = 2.3; // Задаются в кубе с точкой

double originx = 5.420525; // задавать из переменных как в первой строке. Имя переменной только менять
double originy = 100.319500;


double angle = (rnd.Next(359)*Math.PI)/180; // Рандомный угол от 0 до 360 переводится
double pointradius = Math.Round(rnd.NextDouble()*radius, 1); //  rnd.NextDouble - от 0 до 1 , 10 знаков после запятой.
//Умножаем на максимальное значение - radius. Округляем до 1 знака после запятой - 2й параметр (int цифра) можно менять.

// Гоним в переменные x и y соответственно

project.Variables["x"].Value = (originx+(pointradius*Math.Cos(angle))).ToString();
project.Variables["y"].Value = (originy+(pointradius*Math.Sin(angle))).ToString();
51691

от себя добавлю, если будешь циклировать Random rnd определение надо вынести за тело цикла, определить перед, а то будет криво работать выдавая 100500 одинаковых значений в секунду.
 
  • Спасибо
Реакции: sw_sw, prodox и orka13

orka13

Client
Регистрация
07.05.2015
Сообщения
2 167
Благодарностей
2 169
Баллы
113
Тоже заинтересовался, но моих знаний хватило только на простенькую генерацию в форме квадрата а не круга:
C#:
// с такими вариантом получается пофиг точки или запятые в числах:
double radius = Convert.ToDouble("2,1".Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture);
double origin_x = Convert.ToDouble("5,420525".Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture);
double origin_y = Convert.ToDouble("100.319500".Replace(",", "."), System.Globalization.CultureInfo.InvariantCulture);

double origin_x_max = origin_x + radius;
double origin_x_min = origin_x - radius;
double origin_y_max = origin_y + radius;
double origin_y_min = origin_y - radius;

Random random = new Random();
double x_new = random.NextDouble() * (origin_x_max - origin_x_min) + origin_x_min;
project.Variables["x"].Value = Math.Round(x_new,6).ToString(); //округляем до 6 знаков после комы
double y_new = random.NextDouble() * (origin_y_max - origin_y_min) + origin_y_min;
project.Variables["y"].Value = Math.Round(y_new,6).ToString(); //округляем до 6 знаков после комы
 
  • Спасибо
Реакции: prodox

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
Спасибо большое
 
Последнее редактирование:

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 167
Благодарностей
746
Баллы
113
В начало кубика вставь:
Random rnd = new Random();
 
  • Спасибо
Реакции: doc и prodox

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
Непонятно вот что. Координаты указываютсяв грудусах.получается в километрах узказывать не получится точно ибо на разной широте в градусах разное число км ((
 
Последнее редактирование:

TwistDanceR

Активный пользователь
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Непонятно вот что. Координаты указываютсяв грудусах.получается в километрах узказывать не получится точно ибо на разной широте в градусах разное число км ((
Я конечно мог бы вспомнить тройные интегралы, но учитывая, что земля ПЛОСКАЯ (извините не удержался xD).... более эллипсоидная, а мозг мой давно забыл такие вещи, помочь, увы, не смогу.
В остальном, если чем-то помог - рад помочь :-)
 

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
Я конечно мог бы вспомнить тройные интегралы, но учитывая, что земля ПЛОСКАЯ (извините не удержался xD).... более эллипсоидная, а мозг мой давно забыл такие вещи, помочь, увы, не смогу.
В остальном, если чем-то помог - рад помочь :-)
Держите. Может пригодится. база городов с координатами
Залепили бы разрабы фичу, выбираешь город и координаты в заданном радиусе присваиваются
 

Вложения

  • 294,2 КБ Просмотры: 79

prodox

Client
Регистрация
28.08.2018
Сообщения
280
Благодарностей
55
Баллы
28
Или базу Кладр прикрутили, валяется в интернете - бери не хочу
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 167
Благодарностей
2 169
Баллы
113
Непонятно вот что. Координаты указываютсяв грудусах.получается в километрах узказывать не получится точно ибо на разной широте в градусах разное число км ((
Есть у меня шаб где организован поиск по прямоугольнику координатной сетки, но стороны там задаются в километрах а не градусах. Поэтому я и заинтересовался этим топиком. И базу координат по списку нужных городов он с легкостью парсит, там есть триалка для клиентов зенолаба, так что можете заказать и поиграться:
Барсик - парсер Яндекс.Карт (Справочника), 20 000 организаций в минуту + Геокодер. На запросах
То что в разных точках мира в одном градусе будут разные километры кратко и точно описано здесь: https://astropro.ru/?p=kons&id=256. Правда планета земля на плюсах приплюснутая, так что я не на основе формулы той считаю, а исходя из библиотеки "System.Device", она это учитывает.
На основе C#-кода я с костылей собрал вот такой кубик, где учтено расстояние до точки (пределы круга-эллипса) именно в километрах а не градусах. Сначала добавьте в общий код:
Код:
using System.Device.Location;
и в GAC:
Код:
System.Device
Сам код:
C#:
// с такими вариантом получается пофиг точки или запятые в числах:
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);
    }
}
+Log.png
Как видно по логу, у нас не с первого раза находит точку в пределах круга, но это ожидаемо, ресурсов не много кушает. Зато видно что разброс по долготе намного больше чем по широте в пределах тех же 100КМ, а значит шаб работает как надо. Хотя может косяки и есть где :-).
 
Последнее редактирование:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)