Нам нужно найти проекцию анализируемой точки (x0; y0) на отрезок (x1;y1)-(x2;y2) маршрута. Тогда мы сможем понять, лежит ли эта проекция на отрезке. Если лежит, то расстояние от точки до проекции - это расстояние от точки до отрезка. Если не лежит, то расстояние от точки до отрезка - это расстояние от точки до ближайшего конца отрезка. В целом алгоритм примерно таков:
1. Выбираешь две соседние точки из маршрута.
2. Составляешь уравнение прямой. проходящей через эти точки. Обычно оно имеет вид (x - x1) / (x2 - x1) = (y - y1) / (y2 - y1), где две точки - (x1;y1) и (x2;y2).
Но лучше, если переведёшь его в каноническую форму вида Ax+By+C=0.
3. Из канонического уравнения можно узнать нормальный (перпендикулярный) вектор к прямой. Он будет иметь вид N = (A;B), где A и B - коэффициенты из уравнения выше.
4. У тебя получается уравнение прямой, перпендикулярной к нашему отрезку. Оно будет иметь вид (x - x0) / A = (y - y0) / B, где (x0;y0) - это точка, расстояние до которой мы хотим найти.
5. У нас два уравнения прямых. Точка пересечения (точка проекции) будет удовлетворять им обоим, так что надо решить систему.
Bx - Ay - B*x0 + A*y0 = 0
Ax + By + C=0
Система должна иметь одно решение (x;y).
6. Находишь t = (x - x1) / (x2 - x1) = (y - y1) / (y2 - y1) Какое из двух выбрать - зависит от направления прямой. Если прямая вертикальна (x2 - x1) ~= 0, то лучше взять y, и наоборот. t покажет, где на отрезке находится проекция искомой точки.
t = [0...1] - проекция на отрезке. Расстояние от точки до отрезка - это расстояние от (x0;y0) до (x;y).
t < 0 - проекция лежит до начала отрезка. Расстояние от точки до отрезка - это расстояние от (x0;y0) до (x1;y1).
t > 1 - проекция лежит за концом отрезка. Расстояние от точки до отрезка - это расстояние от (x0;y0) до (x2;y2).
Это полное описание, думаю, алгоритм можно упростить.
Кроме того, если длина отрезка (x1;y1)-(x2;y2) мала в сравнении с максимальным допустимым расстоянием до точки (x0;y0), то можно вообще ей пренебречь, и считать расстояние от точки до любого конца отрезка.
Uno di Palermo, ну не то чтобы вредно, но зачем? Если объект wikiart не пригоден к повторному использованию, то тогда да, его нужно создать заново. А если пригоден, то почему бы не использовать его для всех загрузок? Незачем делать лишнюю работу.
Ага, уже лучше. А ничего не работает - это как? Ошибка при установке? Успешная установка, но ошибка при импорте?
Успешный импорт, но ошибка при выполнении кода?
Приведи код (если есть) и текст ошибки.
Что ты понимаешь под "face recognition", и причём тут VS?
Face recognition - это название для семейства технологий, если речь про конкретное ПО/библиотеку, назови её и дай ссылку.
Алан Гибизов, это удобнейшая фича numpy.
Выражение a == 1 вернёт массив из логических элементов такого же размера, как и a. Каждый элемент будет содержать результат сравнения соответствующего элемента a с единицей.
А далее используется тот факт, что в питоне int(True) == 1. Тогда сумма элементов логического массива будет равна количеству истинных элементов в нём.
Александр Ананченко, а. Т.е. это просто в посте опечатка. У тебя второй параметр вместо port написано IP, вот я и подумал что ты не то передаёшь.
Просто для надёжности уточню: точно ли на целевом хосте 95.181.157.90:21 поднят FTP и точно ли он доступен из внешней сети? Другие клиенты коннектятся?
Алексей, у тебя certbot и веб-сервер на одной и той же машине крутятся? Если да, то порты тут ни причём - лишь бы запрос снаружи доходил до веб-сервера.
А вот если на разных, то всё грустно. Либо разбираться, как делать DNS challenge - но это требует программирования, чтобы дергать API твоего DNS провайдера.
Либо исхитряться, и монтировать каталог с одной машины на другую по сети.
Честно, проще завести certbot там же, где веб-сервер.
Алексей, через конфиг - это один способ. Я использую lighttpd + dehydrated (клиент для letsencrypt), но принцип, имхо, один и тот же.
Например, в конфиге lighttpd у меня есть строка
которая редиректит все challenge-запросы в директорию, с которой работает dehydrated.
Но имхо то же самое можно было бы сделать, поместив в /var/www/.well-known симлинк по имени acme-challenge, указывающий на каталог /home/letsencrypt/dehydrated/.acme-challenges .
Конечная цель одна - чтобы HTTP-запрос по URL /.well-known/acme-challenge/чтототам добирался до каталога, с которым работает твой certbot.
Алексей, ты используешь challenge вида HTTP, т.е. тебе нужно иметь поднятый веб-сервер, который готов ответить на запрос issuer'а сертификатов заранее оговоренным ответом (чтобы доказать что ты владеешь доменом, на который выдается сертификат). Как правило, скрипт типа certbot'а указывает/позволяет задать директорию, в которую он будет помещать ответы на challenge. Твоя задача - настроить веб-сервер так, чтобы эта директория была доступна по указанному URL, либо подсунув её в корневой каталог веб-сервера через симлинки, либо настроив url_rewrite, либо ещё как.
Альтернатива - DNS challenge, где тебе потребуется по запросу скрипта создать в домене TXT запись с указанным именем и содержимым. Если твой DNS-хостер предоставляет API для программного управления записями в домене, можно попробовать его. Но HTTP challenge проще для понимания, хотя и требует наличия вебсервера.
Артём Д, английский знаете? Если нет, вставьте в гуглопереводчик get и insert. Сразу станет понятно. X)
get (получить) возвращает текущее содержимое поля ввода, insert (вставить) вставляет строку в указанное место текущего содержимого. Если содержимого нет, то можно вставить в начало (позиция 0), тем самым задав это содержимое.
volodik587, ну да, но имей ввиду, у тебя еще и цикл есть
for user in result:
Он тоже сломается.
Просто имей ввиду что у тебя только один список id юзеров, и перепиши код с учетом этого.
volodik587, причем тут это?
Я написал в чём проблема. Из-за двойного вызова .fetchall() в call_sp будет пустой список вместо результата запроса. Проверь и убедись. А дальше ты пытаешься обратиться к нулевому элементу этого пустого списка и ловишь эксепшен.