ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
751673 Топик полностью
Гудвин, волшебник (23.04.2017 19:53, просмотров: 583) ответил Гудвин на Поинтересуюсь: Кто как решает задачу определения вхождения точки с определенными координатами в полигон произвольной формы на карте? Например, имеется *.kml файл с несколькими десятками полигонов. Есть задача определить принадлежность точки
Чтобы тред не превратился во флейм, рапортую о конкретике ;) Спасибо Генералу за ссылку. Там я благополучно пропустил все математические выкладки и почерпнул только одну важную штуку - имя функции для поиска в тырнетах "PtInPolygon" :) Ну и нашел текстовый исходник от какого то латиноса для дельфей. Без всяческих синусОв и косИнусов. Вот вся начинка: type TPoint2d = record x, y: double; end; var N: integer = 0; Pts: array[0..99] of TPoint2d; {Este algoritmo ?um dos meus grandes achados, pois ?compacto e r?ido} function PtInPolygon(const Pt: TPoint2d; const Points: array of TPoint2d): Boolean; var i: Integer; a, b: ^TPoint2d; cnt: integer; begin Cnt:=0; Result := False; a := @Points[0]; b := @Points[High(Points)]; for i := 0 to High(Points) do begin Result := Result xor (((Pt.Y >= a.Y) xor (Pt.Y >= b.Y)) and (Pt.X - a.X < (b.X - a.X) * (Pt.Y - a.Y) / (b.Y - a.Y))); b := a; // Form1.Label2.Caption:= FloatToStr(a.x)+ ' '+ FloatToStr(a.y); Inc(a); // O mesmo que Inc(Integer(a), SizeOf(a^)) end; end; Не вдавался в алгоритмические подробности, но оно реально работает... И быстро. Количество итераций цикла равно количеству вершин полигона. Вот картинка и проект для дельфей. Можете реально потыкать мышкой и послушать дудкИ ;)