Хобрук: Ваш путь к мастерству в программировании

Сопоставьте точку с ближайшей точкой на решетке Фибоначчи

Я использую следующий код для создания решетки Фибоначчи, см. стр. 4 для единичной сферы. Я думаю, что код работает правильно. Затем у меня есть список точек (указанный широтой и долготой в радианах, так же, как сгенерированные точки решетки Фибоначчи). Для каждой из точек я хочу найти индекс ближайшей точки на решетке Фибоначчи. т.е. У меня есть latitude и longitude, и я хочу получить i. Как бы я это сделал?

Я специально не хочу перебирать все точки сетки и находить точку с минимальным расстоянием, так как на практике я генерирую намного больше, чем просто 50 точки, и я не хочу, чтобы среда выполнения быть O(n*m), если O(m) возможно.

FWIW, говоря о расстоянии, я имею в виду гаверсинусное расстояние.

#!/usr/bin/env python2

import math
import sys

n = 50
phi = (math.sqrt(5.0) + 1.0) / 2.0
phi_inv = phi - 1.0
ga = 2.0 * phi_inv * math.pi

for i in xrange(-n, n + 1):
    longitude = ga * i
    longitude = (longitude % phi) - phi if longitude < 0 else longitude % phi
    latitude = math.asin(2.0 * float(i) / (2.0 * n + 1.0))
    print("{}-th point: ".format(i + n + 1))
    print("\tLongitude is {}".format(longitude))
    print("\tLatitude is {}".format(latitude))

// Given latitude and longitude of point A, determine index i of point which is closest to A
// ???

Ответы:


1

Вероятно, вам нужен пространственный индекс: https://en.wikipedia.org/wiki/Spatial_database#Spatial_index. Поскольку вас интересует только поиск ближайшего соседа, вы можете использовать что-то относительно простое, например http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.KDTree..html.

Обратите внимание, что пространственные индексы обычно рассматривают точки на плоскости, а не на сфере. Чтобы адаптировать его к вашей ситуации, вы, вероятно, захотите разделить сферу на несколько областей, которые можно аппроксимировать прямоугольниками. Затем вы можете найти несколько ближайших соседей в соответствии с прямоугольным приближением и вычислить их фактические расстояния гаверсинуса, чтобы определить истинного ближайшего соседа.

14.06.2016
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..