Найти равномерно распределенные случайные точки на сферической крышке

Давайте проанализируем вашу первоначальную попытку:

a.groupBy((c: Char) => a.count( (d:Char) => d == c))

Итак, вы группируете что-то, что есть что? результат a.count (...), поэтому ключ вашей Карты будет Int. Для char a мы получим 3 для символов b и c, мы получим 2.

Теперь исходная строка будет пройдена и для скопированных результатов char char.

Таким образом, после прохождения первого «ab» текущее состояние «2-> b, 3-> c». (Обратите внимание, что для каждого символа в строке вызывается .count (), который является нерациональным алгоритмом n², но в любом случае).

Строка проходит постепенно, а в конце накопленные результаты показано на рисунке. Как оказалось, 3 "a" были отправлены под клавишей «3», а b и c были отправлены на ключ «2» в порядке прохождения строки, что является порядком слева направо .

Теперь обычная groupBy в списке возвращает что-то вроде Map [T, List [T]], поэтому вы, возможно, ожидали List [Char]. Этого не происходит (потому что Repr для String - String), и ваш список символов эффективно рекомбибилизируется в String и предоставляется вам как таковой.

Следовательно, ваш конечный результат!

1
задан Qwertie 19 January 2019 в 10:44
поделиться

3 ответа

Как упомянуто на вики-странице theta + phi = 90, если phi - широта. С другой стороны, поскольку r зафиксировано для всех точек на крышке, нам просто нужно установить значение theta. Следовательно, вы можете выбрать случайное значение из 0 в theta значение (связанное с ограничением) и определить точку с помощью объясненных ограничений.

0
ответ дан OmG 19 January 2019 в 10:44
поделиться

Вы можете сгенерировать случайный азимут в диапазоне 0..360 и случайное расстояние с sqrt-распределением, чтобы обеспечить равномерное распределение

d = maxR * Sqrt(random(0..1))
theta = random(0..1) * 2 * Pi

Затем получить координаты геопозиции, используя азимут и расстояние, как описано здесь [113 ] (Destination point given distance and bearing from start point)

φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )

where   φ is latitude, λ is longitude, θ is the bearing
(clockwise from north), δ is the angular distance d/R; 
d being the distance travelled, R the earth’s radius
0
ответ дан MBo 19 January 2019 в 10:44
поделиться

Для диска, очень маленького по сравнению с радиусом сферы, проекция по длине широты будет просто приблизительно эллипсом, за исключением случаев, когда вы очень близки к полюсам.

Сначала вычислите растяжение на заданной широте:

double k = cos(latitude * PI / 180);

, затем вычислите радиус диска в градусах широты

// A latitude arc-second is 30.87 meters
double R = radius / 30.87 / 3600 * PI / 180;

, а затем вычислите равномерную случайную точку в круге

double a = random() * 2 * PI;
double r = R * sqrt(random());

ваша случайная точка на диске будет

double random_lat = (latitude*PI/180 + r*cos(a))/PI*180;
double random_longitude = (longitude*PI/180 + (r/k)*sin(a))/PI*180;
0
ответ дан 6502 19 January 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: