Last active
April 18, 2016 05:50
-
-
Save pokatomnik/9d35cae3a6d7c2312d81934fcee58a37 to your computer and use it in GitHub Desktop.
phaserjs perforated polygons
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var polygons = [ // A | |
[ // B | |
[ // C | |
[200, 100], // D | |
[350, 100], | |
[375, 200], | |
[150, 200], | |
], | |
[ | |
/* [210, 110], */ //[250, 110], | |
/* [250, 110], */ [270, 190], | |
/* [270, 190], */ [160, 190], | |
/* [160, 190], */ [210, 110] | |
], | |
[ | |
[260, 110], | |
[340, 110], | |
[365, 190] | |
] | |
] | |
]; | |
/** | |
* "Уплощает" мультиполигон, позволяя линейным массивом точек | |
* полигона описать полигон с перфорацией. Совместим с GeoGSON, | |
* другими словами, превращает массив вида | |
* [ | |
* [ | |
* [ | |
* [x, y], [x1, y1], ..., [xN, yN] | |
* ], | |
* [ | |
* [xPerf, yPerf], [xPerf1, yPerf1], ..., [xPerfN, yPerfN] | |
* ] | |
* ], | |
* ] | |
* в более "плоский" массив, совместимый с полигонами PhaserJS, не | |
* поддерживающими перфорацию полигонов. | |
* @param {[array]} polygons массив мультиполигонов формата GEOJSON | |
* @return {[array]} "уплощенный" полигон | |
*/ | |
function convertGEOJSONPolygonsToFlatPolygonsArray(polygons) { | |
/** | |
* Функция, которая "уплощает" конкретный полигон из массива полигонов | |
* GEOJSON | |
* @param {[array]} multiPolygon конкреный полигон с перфорацией | |
* @return {[type]} плоский полигон из точек | |
*/ | |
function convertPerforatedPolygonArrayToFlatPolygon(multiPolygon) { | |
// будущий массив точек | |
var points = []; | |
// точка, от которой следует рисовать вложенные полигоны - любая, | |
// поэтому берем именно первую: | |
points.push(multiPolygon[0][0]); | |
// Перебор вложенных полигонов, запись их в массив точек, замыкание | |
// вложенного полигона и возврат к первой точке внешнего полигона | |
for (var i=1; i<multiPolygon.length; i++) { | |
var currentFigure = multiPolygon[i]; | |
for (var j=0; j<currentFigure.length; j++) { | |
var currentPoint = currentFigure[j]; | |
points.push(currentPoint); | |
} | |
points.push(currentFigure[0]); | |
points.push(multiPolygon[0][0]); | |
} | |
// Рисование первой фигуры. Надо рисовать от последней точки до 2й, | |
// идем в обратную сторону. | |
var firstFigure = multiPolygon[0]; | |
for (var k=firstFigure.length-1; k>0; k--) { | |
var currentPoint = firstFigure[k]; | |
points.push(currentPoint); | |
} | |
points.push(multiPolygon[0][0]); | |
return points; | |
} | |
var result = []; | |
var multiPolygons = polygons; | |
var multyPolygonsLength = multiPolygons.length; | |
// Вызываем функцию для каждого полигона из мультиполигонов | |
for (var i=0; i<multyPolygonsLength; i++) { | |
var currentMultiPolygon = multiPolygons[i]; | |
result.push(convertPerforatedPolygonArrayToFlatPolygon(currentMultiPolygon)); | |
} | |
return result; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment