Определить точку разворота
-
- Участник
- Сообщения: 79
- Зарегистрирован: 01 май 2013, 22:38
- Репутация: 30
- Откуда: Сыктывкар
Определить точку разворота
Коллеги, подскажите пожалуйста, каким образом можно определить подобные точки разворота (перегиба), желательно на питоне.
- Вложения
-
- shp.zip
- (43.71 КБ) 179 скачиваний
-
- points.jpg (72.53 КБ) 1922 просмотра
-
- Гуру
- Сообщения: 4056
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Определить точку разворота
Посчитать угол между последовательными сегментами. В простейшем случае - знак скалярного произведения, чтобы определить угол тупой или острый. Можно даже в Ёкселе.
-
- Гуру
- Сообщения: 4056
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Определить точку разворота
если дрон дрыгается, то для повышения устойчивости может понадобится экспоненциальное сглаживание векторов (или просто сравнение среднего из 5-7 векторов до анализируемой точки, и столько же после).
-
- Участник
- Сообщения: 79
- Зарегистрирован: 01 май 2013, 22:38
- Репутация: 30
- Откуда: Сыктывкар
Re: Определить точку разворота
gamm, дрон действительно дрыгается.
Выкладываю работающий в моём случае способ, может быть кому-нибудь пригодится при решении сходных задач. Исходные данные читаются из файла coord.xlsx. Использовал алгоритм Рамера–Дугласа–Пекера и вычисление разницы азимутов между двумя отрезками.
Выкладываю работающий в моём случае способ, может быть кому-нибудь пригодится при решении сходных задач. Исходные данные читаются из файла coord.xlsx. Использовал алгоритм Рамера–Дугласа–Пекера и вычисление разницы азимутов между двумя отрезками.
Код: Выделить всё
import pyproj
from rdp import rdp
from openpyxl import load_workbook
xlssourse = 'coord.xlsx'
wbsource = load_workbook(xlssourse)
sheetsource = wbsource['Лист1']
PointList = []
geodesic = pyproj.Geod(ellps='WGS84')
row = 2
fileId = sheetsource.cell(column=1, row=row).value
while fileId is not None:
long = sheetsource.cell(column=1, row=row).value
lat = sheetsource.cell(column=2, row=row).value
if (type(long) == float) and (type(lat) == float):
if [long, lat] not in PointList:
PointList.append([long, lat])
row += 1
fileId = sheetsource.cell(column=1, row=row).value
PointListRdp = rdp(PointList, epsilon=0.0000005)
row = 1
for element in PointListRdp:
pntOneX = element[0]
pntOneY = element[1]
if ('pntTwoX' in locals()) and ('pntTwoY' in locals()):
cur_azimuth, back_azimuth, distance = geodesic.inv(pntOneX, pntOneY, pntTwoX, pntTwoY)
if 'new_azimuth' in locals():
dif_azimuth = new_azimuth - cur_azimuth
if (abs(dif_azimuth) > 120) and (abs(dif_azimuth) < 240):
print(pntTwoX, pntTwoY)
new_azimuth = cur_azimuth
pntTwoX = pntOneX
pntTwoY = pntOneY
row += 1
- Вложения
-
- coord.zip
- (46.06 КБ) 219 скачиваний
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 30 гостей