проверить, перекрываются ли 2 полигона в ruby

Я ищу способ проверить, перекрываются ли 2 многоугольника (набор координат широты/долготы) в рубине. Так, например, если у меня есть баллы для США и баллы для Калифорнии, я должен сказать, что они перекрываются.

Я изучил rgeo, но, по-видимому, для его работы требуются некоторые двоичные файлы только для Linux, и я ищу кросс-платформенное решение.

Например, допустим, у меня есть 2 многоугольника, которые выглядят так:

p1 = [[30, 30], [30, 40], [40, 40], [40, 30], [30, 30]]
p2 = [[35, 35], [35, 45], [45, 45], [45, 35], [35, 35]]

Как я могу показать, что они перекрываются в рубине?


person pguardiario    schedule 17.01.2016    source источник
comment
Это зависит от того, являются ли оба многоугольника выпуклыми. (Множество называется выпуклым, если все точки на прямой, соединяющей любые две точки множества, принадлежат множеству.) Если любой из многоугольников не является выпуклым, возникает неприятная проблема. Если они оба выпуклые, вам нужно определить (как уже упоминалось), находится ли какая-либо вершина первого выпуклого многоугольника внутри второго выпуклого многоугольника. Я показал, как это сделать (для одной вершины) здесь.   -  person Cary Swoveland    schedule 17.01.2016
comment
Хорошо, давайте предположим, что оба многоугольника выпуклы.   -  person pguardiario    schedule 17.01.2016
comment
Если вы настаиваете на использовании библиотек, которые легко использовать с окнами, вы должны указать это в своем вопросе.   -  person boulder_ruby    schedule 25.01.2016
comment
Все это есть во втором абзаце. Я выполнил все шаги, чтобы заставить rgeos работать в Windows, и по-прежнему испытываю проблемы с этой конкретной библиотекой.   -  person pguardiario    schedule 25.01.2016


Ответы (1)


Используя rgeo, это будет выглядеть примерно так...

примечание: я просто собираюсь использовать свою локальную прямолинейную проекцию для этого, SRID: 3361, должно работать нормально. Единицы в футах, так сказать. Но в основном просто декартова сетка CRS (система отсчета координат)

require 'rgeo'
f = RGeo::Geos.factory(:srid => 3361)
p1 = [[30, 30], [30, 40], [40, 40], [40, 30], [30, 30]]
p2 = [[35, 35], [35, 45], [45, 45], [45, 35], [35, 35]]
#first you have to build the polygons, its a 3 step process. array of points --> linear ring --> polygon
polygons = []
[p1, p2].each do |pointset|
  points = []
  pointset.each do |x, y|
    points << f.point(x,y)
  end
  polygons << f.polygon(f.linear_ring(points))
end
#then you'd just use rgeo's methods to do the work
polygons[0].overlaps?(polygons[1])
#=> true

Протестировал это. оно работает

person boulder_ruby    schedule 20.01.2016
comment
Это выглядит хорошо, но RGeo::Geos требует некоторых двоичных файлов только для Linux, и я ищу что-то, что будет работать на Windows. - person pguardiario; 21.01.2016
comment
Linux или Mac... и похоже, что есть некоторая поддержка Windows, но сначала вам нужно прыгнуть через некоторые обручи. Задающий вопрос ответил на свой вопрос, что означает, что он заработал. stackoverflow.com/questions/22297117/ - person boulder_ruby; 21.01.2016
comment
Я потратил некоторое время на попытки, но в конце концов мне пришлось сдаться, потому что я ничего не добился. - person pguardiario; 21.01.2016