Предотвратить наложение многоугольника на себя - PullRequest
0 голосов
/ 14 ноября 2011

Я создаю многоугольник, используя Google Maps V3 API.Он начинается с четырехстороннего многоугольника, который является квадратом.

Проблема: Теперь, когда к многоугольнику добавляется новая точка, многоугольник может перекрывать себя в странной форме вместо формирования пятиугольника.Это потому, что многоугольник рисуется в том порядке, в котором точки добавляются в массив.Можно ли переставить точки многоугольника, чтобы две линии не перекрывали друг друга?

Ответы [ 3 ]

0 голосов
/ 18 сентября 2012

Я успешно выполнил предложение Blazemonger выше, и оно работает для меня.

Вот его новое предложение:

Другой подход, который мне кажется более простым: если новая точка (а) НЕ внутри существующего многоугольника и (б) создает внутренний угол больше 180 градусов, тогда он должен быть недействительным. Есть много существующих алгоритмов для проверки, находится ли точка в внутренняя часть многоугольника (stackoverflow.com/q/471962/901048) и измерение внутреннего угла является вопросом нахождения разницы между арктангенсами каждого склона

Чтобы определить, находится ли точка в многоугольнике, я использовал многоугольник. Содержит функцию из обновленного epoly.js Майка Уильямса, найденного здесь: http://www.geocodezip.com/scripts/v3_epoly.js.

Если точка не находится в многоугольнике (см. Выше), мы: 1.) Определите, превышает ли внутренний угол последних двух векторов 180 градусов. Для этого нам нужно реализовать приведенное ниже уравнение, чтобы найти угол двух последних векторов многоугольника:

angleRadians = Math.acos ((vx1 * vx2 + vy1 * vy2) / (Math.sqrt (vx1 * vx1 + vy1 * vy1) * Math.sqrt (vx2 * vx2 + vy2 * vy2)));

это использование произведения точек векторов.

Но это не учитывает «направление намотки», сначала вы должны получить перекрестное произведение, и, если перекрестное произведение положительное, это был левый поворот, если отрицательным - правый поворот.

Я включил здесь свой JS-код в качестве сущности: https://gist.github.com/3741816.

Кстати, я новичок здесь, в StackOverflow - это был такой большой ресурс для меня, спасибо всем, кто внес свой вклад!

0 голосов
/ 15 января 2019

Мы можем обнаружить перекрытие двух многоугольников. Но я просто кодирую в js, а затем мы можем предотвратить перекрытие многоугольника путем предупреждения об ошибках.

  1. Включает CDN библиотек.
  2. Существующие полигоны имеют форму многоугольников в переменной js или массиве js. (Т.е. e)
  3. Создать новый многоугольник.
  4. Поиск второго многоугольника до первого многоугольника. Оба полигона одинаковы, поэтому вы можете их поменять. Эти cdn библиотек вы должны использовать их.

https://maps.googleapis.com/maps/api/js?v=3 https://code.jquery.com/jquery-1.11.1.min.js https://bl.ocks.org/christophermanning/raw/4450188/javascript.util.min.js https://bl.ocks.org/christophermanning/raw/4450188/jsts.min.js https://cdnjs.cloudflare.com/ajax/libs/wicket/1.1.0/wicket.js https://cdnjs.cloudflare.com/ajax/libs/wicket/1.1.0/wicket-gmap3.js

          var values=[ new google.maps.LatLng(59.73858,10.24296), new 
           google.maps.LatLng(59.74879,10.26459), new 
           google.maps.LatLng(59.73858,10.28965), new 
           google.maps.LatLng(59.7192,10.28965), new 
           google.maps.LatLng(59.7192,10.24296), new 
           google.maps.LatLng(59.73858,10.24296)];
          var new_shape=[ new google.maps.LatLng(59.73858,10.24296), new 
           google.maps.LatLng(59.74879,10.26459), new 
           google.maps.LatLng(59.73858,10.28965), new 
            google.maps.LatLng(59.7192,10.28965), new 
            google.maps.LatLng(59.7192,10.24296), new 
            google.maps.LatLng(59.73858,10.24296)];


           var existing_polygon = new google.maps.Polygon({
                         paths: values,
                         strokeColor: #000000,
                         strokeOpacity: 0.8,
                         strokeWeight: 1.5,
                         fillColor: #ff0000,
                         fillOpacity: 0.35,
                           });

              var polygone_new_shape= new google.maps.Polygon({
                     paths: [new_shape],
                     strokeColor: '#000000',
                     strokeOpacity: 0.8,
                     strokeWeight: 1,
                     fillColor: '#00FF00',
                     fillOpacity: 0.35
                     });


         var wkt = UseWicketToGoFromGooglePolysToWKT(existing_polygon, polygone_new_shape);
         var result= UseJstsToTestForIntersection(wkt,wkt);
                if(result==true){
                   alert("Polygon are overlapping existing polygon");
                   }

       function UseWicketToGoFromGooglePolysToWKT(poly1, poly2) {

                 var wicket = new Wkt.Wkt();
                  wicket.fromObject(poly1);
                  var wkt1 = wicket.write();
                  wicket.fromObject(poly2);
                  var wkt2 = wicket.write();
                    return [wkt1, wkt2];
                  }
         function UseJstsToTestForIntersection(wkt1, wkt2) {

                  var wktReader = new jsts.io.WKTReader();
                  var geom1 = wktReader.read(wkt1);
                  var geom2 = wktReader.read(wkt2);
                  var result;
                 if (geom2.intersects(geom1)) {
                   result=true;
                  }else{
                  result=false;
                  }
                 return result;
                }
0 голосов
/ 18 февраля 2012

Я решил оставить эту проблему нерешенной в своем веб-приложении, пока кто-нибудь не решит ее !!

...