Skip to content

Instantly share code, notes, and snippets.

@pokatomnik
Last active April 18, 2016 05:50
Show Gist options
  • Save pokatomnik/9d35cae3a6d7c2312d81934fcee58a37 to your computer and use it in GitHub Desktop.
Save pokatomnik/9d35cae3a6d7c2312d81934fcee58a37 to your computer and use it in GitHub Desktop.
phaserjs perforated polygons
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