Как пересекаются два полигона?

JsonObjectRequest фактически принимает JSONObject как тело.

Из эта статья в блоге ,

final String url = "some/url";
final JSONObject jsonBody = new JSONObject("{\"type\":\"example\"}");

new JsonObjectRequest(url, jsonBody, new Response.Listener() { ... });

Вот источник код и JavaDoc (@param jsonRequest):

/**
 * Creates a new request.
 * @param method the HTTP method to use
 * @param url URL to fetch the JSON from
 * @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and
 *   indicates no parameters will be posted along with request.
 * @param listener Listener to receive the JSON response
 * @param errorListener Error listener, or null to ignore errors.
 */
public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
        Listener listener, ErrorListener errorListener) {
    super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
                errorListener);
}

30
задан mvw 11 April 2014 в 13:53
поделиться

8 ответов

Как я думаю, вы следует сделать

Не пытайтесь сделать это самостоятельно, если вы можете помочь. Вместо этого используйте один из многих доступных алгоритмов пересечения многоугольников, которые уже существуют.

Я серьезно рассматривал следующую кодовую базу на основании их демонстрационного кода и того факта, что они упомянули свою обработку большинства / всех странных случаев. Вам нужно будет пожертвовать определенную сумму (по вашему выбору / выбору вашей компании), если вы используете ее в коммерческих целях, но это того стоит, чтобы получить надежную версию такого кода.

http://www.cs.man.ac . uk / ~ toby / gpc /

На самом деле я использовал алгоритм пересечения многоугольников, который является частью библиотек Java2D. Вы можете найти что-то подобное в собственных библиотеках C # MS.

Есть и другие варианты; ищите "обрезку многоугольника" или "обрезку многоугольника", поскольку те же самые базовые алгоритмы, которые обрабатывают пересечение многоугольника, также имеют тенденцию использоваться для общих случаев обрезки.

Если у вас действительно есть библиотека обрезки многоугольника, вам просто нужно вычесть многоугольник B из многоугольника A, чтобы получить ваш первый результат, и пересечь многоугольники A и B, чтобы получить второй фрагмент.

Как свернуть свой собственный, для безнадежно мазохистского

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

http://cs1.bradley.edu/public/jcm/weileratherton.html

http://en.wikipedia.org/wiki/Weiler-Atherton

подробности, как говорится, слишком полны, чтобы включать их здесь, но я не сомневаюсь, что вы сможете найти ссылки на Weiler-Atherton на долгие годы. По сути, вы разделяете все точки на те, которые входят в последний многоугольник или выходят из последнего многоугольника, затем вы формируете график из всех точек, а затем перемещаетесь по графику в соответствующих направлениях, чтобы извлечь все части многоугольника, которые вы хочу. Изменяя способ определения и обработки «входящего» и «выходящего» полигонов, вы можете добиться нескольких возможных пересечений полигонов (И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ и т. Д.).

На самом деле это вполне реализуемо, но как и с любой вычислительной геометрией код,

10
ответ дан 27 November 2019 в 23:57
поделиться

Библиотека Араша Партоу FastGEO содержит реализации многих интересных алгоритмов вычислительной геометрии. Пересечение многоугольников - одно из них. Он написан на Паскале, но реализует только математику, поэтому его довольно удобно читать. Обратите внимание, что вам определенно нужно будет немного предварительно обработать края, чтобы расположить их по часовой стрелке или против часовой стрелки.

ETA: Но на самом деле, лучший способ сделать это - не делать этого . Найдите другой способ решения вашей проблемы, не связанный с произвольными пересечениями многоугольников.

17
ответ дан 27 November 2019 в 23:57
поделиться

Вы также можете взглянуть на NetTopologySuite или даже попробовать импортировать его в Sql server 2008 и его пространственные инструменты.

2
ответ дан 27 November 2019 в 23:57
поделиться

Многоугольник полностью описывается упорядоченным списком точек (P1, P2, ..., Pn). Ребра - это (P1 - P2), (P2 - P3), ..., (Pn - P1). Если у вас есть два перекрывающихся многоугольника A и B, будет точка An (из списка точек, описывающих многоугольник A), которая находится в области, окруженной многоугольником B, или наоборот (точка B лежит в A). Если такая точка не найдена, полигоны не перекрываются. Если такая точка найдена (т.е. Ai), проверьте соседние точки многоугольника A (i-1) и A (i + 1). Повторяйте до тех пор, пока не найдете точку за пределами области или все точки не будут отмечены (тогда первый многоугольник полностью лежит внутри второго многоугольника). Если вы нашли точку снаружи, вы можете рассчитать точку пересечения. Найдите соответствующее ребро многоугольника B и следуйте за ним с зарезервированными ролями = теперь проверьте, лежат ли точки многоугольника B внутри многоугольника A. Таким образом вы можете построить список точек, которые описывают перекрывающийся многоугольник. При необходимости вы должны проверить идентичность полигонов, (P1, P2, P3) === (P2, P3, P1).

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

narozed

2
ответ дан 27 November 2019 в 23:57
поделиться

Если вы осмелитесь взглянуть на код GPL C ++ других людей, вы увидите, как они это делают в Inkscape:

http://bazaar.launchpad.net/~inkscape .dev / inkscape / trunk / view / head: /src/2geom/shape.cpp (строка 126)

2
ответ дан 27 November 2019 в 23:57
поделиться

Попробуйте использовать для этого инструменты ГИС, такие как ArcObjects, TopologySuite, GEOS, OGR и т. Д. Я не уверен, все ли эти дистрибутивы доступны для .net, но все они доступны то же самое.

2
ответ дан 27 November 2019 в 23:57
поделиться

Если вы программируете в .NET Framework, вы можете взглянуть на класс SqlGeometry, доступный в сборках .NET, поставляемых как Системные типы CLR Microsoft SQL Server

Класс SqlGeometry предоставляет метод STIntersection

SqlGeometry g1 = SqlGeometry.Parse("POLYGON ((...))");
SqlGeometry g2 = SqlGeometry.Parse("POLYGON ((...))");
SqlGeometry intersection = g1.STIntersection(g2);
12
ответ дан 27 November 2019 в 23:57
поделиться

Clipper - это бесплатное программное обеспечение с открытым исходным кодом библиотека отсечения полигонов (написанная на Delphi и C ++), которая делает именно то, о чем вы просите - http://sourceforge.net/projects/polyclipping/

В моем тестировании Clipper значительно быстрее и гораздо менее подвержен ошибкам, чем GPC (см. Более подробные сравнения здесь - http://www.angusj.com/delphi/clipper.php#features ) . Кроме того, хотя есть исходный код как для Delphi, так и для C ++, библиотека Clipper также включает скомпилированную DLL, чтобы упростить использование функций отсечения и на других (Windows) языках.

2
ответ дан 27 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: