| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793 | import bbox from '@turf/bbox';import area from '@turf/area';import booleanPointInPolygon from '@turf/boolean-point-in-polygon';import explode from '@turf/explode';import { collectionOf, getCoords } from '@turf/invariant';import { isObject, multiPolygon, featureCollection, polygon } from '@turf/helpers';import objectAssign from 'object-assign';import { featureEach } from '@turf/meta';/** * Takes a {@link Point} grid and returns a correspondent matrix {Array<Array<number>>} * of the 'property' values * * @name gridToMatrix * @param {FeatureCollection<Point>} grid of points * @param {Object} [options={}] Optional parameters * @param {string} [options.zProperty='elevation'] the property name in `points` from which z-values will be pulled * @param {boolean} [options.flip=false] returns the matrix upside-down * @param {boolean} [options.flags=false] flags, adding a `matrixPosition` array field ([row, column]) to its properties, * the grid points with coordinates on the matrix * @returns {Array<Array<number>>} matrix of property values * @example *   var extent = [-70.823364, -33.553984, -70.473175, -33.302986]; *   var cellSize = 3; *   var grid = turf.pointGrid(extent, cellSize); *   // add a random property to each point between 0 and 60 *   for (var i = 0; i < grid.features.length; i++) { *     grid.features[i].properties.elevation = (Math.random() * 60); *   } *   gridToMatrix(grid); *   //= [ *     [ 1, 13, 10,  9, 10, 13, 18], *     [34,  8,  5,  4,  5,  8, 13], *     [10,  5,  2,  1,  2,  5,  4], *     [ 0,  4, 56, 19,  1,  4,  9], *     [10,  5,  2,  1,  2,  5, 10], *     [57,  8,  5,  4,  5,  0, 57], *     [ 3, 13, 10,  9,  5, 13, 18], *     [18, 13, 10,  9, 78, 13, 18] *   ] */function gridToMatrix(grid, options) {  // Optional parameters  options = options || {};  if (!isObject(options)) throw new Error("options is invalid");  var zProperty = options.zProperty || "elevation";  var flip = options.flip;  var flags = options.flags;  // validation  collectionOf(grid, "Point", "input must contain Points");  var pointsMatrix = sortPointsByLatLng(grid, flip);  var matrix = [];  // create property matrix from sorted points  // looping order matters here  for (var r = 0; r < pointsMatrix.length; r++) {    var pointRow = pointsMatrix[r];    var row = [];    for (var c = 0; c < pointRow.length; c++) {      var point = pointRow[c];      // Check if zProperty exist      if (point.properties[zProperty]) row.push(point.properties[zProperty]);      else row.push(0);      // add flags      if (flags === true) point.properties.matrixPosition = [r, c];    }    matrix.push(row);  }  return matrix;}/** * Sorts points by latitude and longitude, creating a 2-dimensional array of points * * @private * @param {FeatureCollection<Point>} points GeoJSON Point features * @param {boolean} [flip=false] returns the matrix upside-down * @returns {Array<Array<Point>>} points ordered by latitude and longitude */function sortPointsByLatLng(points, flip) {  var pointsByLatitude = {};  // divide points by rows with the same latitude  featureEach(points, function (point) {    var lat = getCoords(point)[1];    if (!pointsByLatitude[lat]) pointsByLatitude[lat] = [];    pointsByLatitude[lat].push(point);  });  // sort points (with the same latitude) by longitude  var orderedRowsByLatitude = Object.keys(pointsByLatitude).map(function (lat) {    var row = pointsByLatitude[lat];    var rowOrderedByLongitude = row.sort(function (a, b) {      return getCoords(a)[0] - getCoords(b)[0];    });    return rowOrderedByLongitude;  });  // sort rows (of points with the same latitude) by latitude  var pointMatrix = orderedRowsByLatitude.sort(function (a, b) {    if (flip) return getCoords(a[0])[1] - getCoords(b[0])[1];    else return getCoords(b[0])[1] - getCoords(a[0])[1];  });  return pointMatrix;}/*! * @license GNU Affero General Public License. * Copyright (c) 2015, 2015 Ronny Lorenz <ronny@tbi.univie.ac.at> * v. 1.2.0 * https://github.com/RaumZeit/MarchingSquares.js * * MarchingSquaresJS is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MarchingSquaresJS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU Affero General Public License for more details. * * As additional permission under GNU Affero General Public License version 3 * section 7, third-party projects (personal or commercial) may distribute, * include, or link against UNMODIFIED VERSIONS of MarchingSquaresJS without the * requirement that said third-party project for that reason alone becomes * subject to any requirement of the GNU Affero General Public License version 3. * Any modifications to MarchingSquaresJS, however, must be shared with the public * and made available. * * In summary this: * - allows you to use MarchingSquaresJS at no cost * - allows you to use MarchingSquaresJS for both personal and commercial purposes * - allows you to distribute UNMODIFIED VERSIONS of MarchingSquaresJS under any *   license as long as this license notice is included * - enables you to keep the source code of your program that uses MarchingSquaresJS *   undisclosed * - forces you to share any modifications you have made to MarchingSquaresJS, *   e.g. bug-fixes * * You should have received a copy of the GNU Affero General Public License * along with MarchingSquaresJS.  If not, see <http://www.gnu.org/licenses/>. */var defaultSettings = {  successCallback: null,  verbose: false,  polygons: false,};var settings = {};/*  Compute isobands(s) of a scalar 2D field given a certain  threshold and a bandwidth by applying the Marching Squares  Algorithm. The function returns a list of path coordinates  either for individual polygons within each grid cell, or the  outline of connected polygons.*/function isoBands(data, minV, bandwidth, options) {  /* process options */  options = options ? options : {};  var optionKeys = Object.keys(defaultSettings);  for (var i = 0; i < optionKeys.length; i++) {    var key = optionKeys[i];    var val = options[key];    val =      typeof val !== "undefined" && val !== null ? val : defaultSettings[key];    settings[key] = val;  }  if (settings.verbose)    console.log(      "MarchingSquaresJS-isoBands: computing isobands for [" +        minV +        ":" +        (minV + bandwidth) +        "]"    );  var grid = computeBandGrid(data, minV, bandwidth);  var ret;  if (settings.polygons) {    if (settings.verbose)      console.log(        "MarchingSquaresJS-isoBands: returning single polygons for each grid cell"      );    ret = BandGrid2Areas(grid);  } else {    if (settings.verbose)      console.log(        "MarchingSquaresJS-isoBands: returning polygon paths for entire data grid"      );    ret = BandGrid2AreaPaths(grid);  }  if (typeof settings.successCallback === "function")    settings.successCallback(ret);  return ret;}/*  Thats all for the public interface, below follows the actual  implementation*//* Some private variables */var Node0 = 64,  Node1 = 16,  Node2 = 4,  Node3 = 1;/*  The look-up tables for tracing back the contour path  of isoBands*/var isoBandNextXTL = [];var isoBandNextYTL = [];var isoBandNextOTL = [];var isoBandNextXTR = [];var isoBandNextYTR = [];var isoBandNextOTR = [];var isoBandNextXRT = [];var isoBandNextYRT = [];var isoBandNextORT = [];var isoBandNextXRB = [];var isoBandNextYRB = [];var isoBandNextORB = [];var isoBandNextXBL = [];var isoBandNextYBL = [];var isoBandNextOBL = [];var isoBandNextXBR = [];var isoBandNextYBR = [];var isoBandNextOBR = [];var isoBandNextXLT = [];var isoBandNextYLT = [];var isoBandNextOLT = [];var isoBandNextXLB = [];var isoBandNextYLB = [];var isoBandNextOLB = [];isoBandNextXRT[85] = isoBandNextXRB[85] = -1;isoBandNextYRT[85] = isoBandNextYRB[85] = 0;isoBandNextORT[85] = isoBandNextORB[85] = 1;isoBandNextXLT[85] = isoBandNextXLB[85] = 1;isoBandNextYLT[85] = isoBandNextYLB[85] = 0;isoBandNextOLT[85] = isoBandNextOLB[85] = 1;isoBandNextXTL[85] = isoBandNextXTR[85] = 0;isoBandNextYTL[85] = isoBandNextYTR[85] = -1;isoBandNextOTL[85] = isoBandNextOBL[85] = 0;isoBandNextXBR[85] = isoBandNextXBL[85] = 0;isoBandNextYBR[85] = isoBandNextYBL[85] = 1;isoBandNextOTR[85] = isoBandNextOBR[85] = 1;/* triangle cases */isoBandNextXLB[1] = isoBandNextXLB[169] = 0;isoBandNextYLB[1] = isoBandNextYLB[169] = -1;isoBandNextOLB[1] = isoBandNextOLB[169] = 0;isoBandNextXBL[1] = isoBandNextXBL[169] = -1;isoBandNextYBL[1] = isoBandNextYBL[169] = 0;isoBandNextOBL[1] = isoBandNextOBL[169] = 0;isoBandNextXRB[4] = isoBandNextXRB[166] = 0;isoBandNextYRB[4] = isoBandNextYRB[166] = -1;isoBandNextORB[4] = isoBandNextORB[166] = 1;isoBandNextXBR[4] = isoBandNextXBR[166] = 1;isoBandNextYBR[4] = isoBandNextYBR[166] = 0;isoBandNextOBR[4] = isoBandNextOBR[166] = 0;isoBandNextXRT[16] = isoBandNextXRT[154] = 0;isoBandNextYRT[16] = isoBandNextYRT[154] = 1;isoBandNextORT[16] = isoBandNextORT[154] = 1;isoBandNextXTR[16] = isoBandNextXTR[154] = 1;isoBandNextYTR[16] = isoBandNextYTR[154] = 0;isoBandNextOTR[16] = isoBandNextOTR[154] = 1;isoBandNextXLT[64] = isoBandNextXLT[106] = 0;isoBandNextYLT[64] = isoBandNextYLT[106] = 1;isoBandNextOLT[64] = isoBandNextOLT[106] = 0;isoBandNextXTL[64] = isoBandNextXTL[106] = -1;isoBandNextYTL[64] = isoBandNextYTL[106] = 0;isoBandNextOTL[64] = isoBandNextOTL[106] = 1;/* single trapezoid cases */isoBandNextXLT[2] = isoBandNextXLT[168] = 0;isoBandNextYLT[2] = isoBandNextYLT[168] = -1;isoBandNextOLT[2] = isoBandNextOLT[168] = 1;isoBandNextXLB[2] = isoBandNextXLB[168] = 0;isoBandNextYLB[2] = isoBandNextYLB[168] = -1;isoBandNextOLB[2] = isoBandNextOLB[168] = 0;isoBandNextXBL[2] = isoBandNextXBL[168] = -1;isoBandNextYBL[2] = isoBandNextYBL[168] = 0;isoBandNextOBL[2] = isoBandNextOBL[168] = 0;isoBandNextXBR[2] = isoBandNextXBR[168] = -1;isoBandNextYBR[2] = isoBandNextYBR[168] = 0;isoBandNextOBR[2] = isoBandNextOBR[168] = 1;isoBandNextXRT[8] = isoBandNextXRT[162] = 0;isoBandNextYRT[8] = isoBandNextYRT[162] = -1;isoBandNextORT[8] = isoBandNextORT[162] = 0;isoBandNextXRB[8] = isoBandNextXRB[162] = 0;isoBandNextYRB[8] = isoBandNextYRB[162] = -1;isoBandNextORB[8] = isoBandNextORB[162] = 1;isoBandNextXBL[8] = isoBandNextXBL[162] = 1;isoBandNextYBL[8] = isoBandNextYBL[162] = 0;isoBandNextOBL[8] = isoBandNextOBL[162] = 1;isoBandNextXBR[8] = isoBandNextXBR[162] = 1;isoBandNextYBR[8] = isoBandNextYBR[162] = 0;isoBandNextOBR[8] = isoBandNextOBR[162] = 0;isoBandNextXRT[32] = isoBandNextXRT[138] = 0;isoBandNextYRT[32] = isoBandNextYRT[138] = 1;isoBandNextORT[32] = isoBandNextORT[138] = 1;isoBandNextXRB[32] = isoBandNextXRB[138] = 0;isoBandNextYRB[32] = isoBandNextYRB[138] = 1;isoBandNextORB[32] = isoBandNextORB[138] = 0;isoBandNextXTL[32] = isoBandNextXTL[138] = 1;isoBandNextYTL[32] = isoBandNextYTL[138] = 0;isoBandNextOTL[32] = isoBandNextOTL[138] = 0;isoBandNextXTR[32] = isoBandNextXTR[138] = 1;isoBandNextYTR[32] = isoBandNextYTR[138] = 0;isoBandNextOTR[32] = isoBandNextOTR[138] = 1;isoBandNextXLB[128] = isoBandNextXLB[42] = 0;isoBandNextYLB[128] = isoBandNextYLB[42] = 1;isoBandNextOLB[128] = isoBandNextOLB[42] = 1;isoBandNextXLT[128] = isoBandNextXLT[42] = 0;isoBandNextYLT[128] = isoBandNextYLT[42] = 1;isoBandNextOLT[128] = isoBandNextOLT[42] = 0;isoBandNextXTL[128] = isoBandNextXTL[42] = -1;isoBandNextYTL[128] = isoBandNextYTL[42] = 0;isoBandNextOTL[128] = isoBandNextOTL[42] = 1;isoBandNextXTR[128] = isoBandNextXTR[42] = -1;isoBandNextYTR[128] = isoBandNextYTR[42] = 0;isoBandNextOTR[128] = isoBandNextOTR[42] = 0;/* single rectangle cases */isoBandNextXRB[5] = isoBandNextXRB[165] = -1;isoBandNextYRB[5] = isoBandNextYRB[165] = 0;isoBandNextORB[5] = isoBandNextORB[165] = 0;isoBandNextXLB[5] = isoBandNextXLB[165] = 1;isoBandNextYLB[5] = isoBandNextYLB[165] = 0;isoBandNextOLB[5] = isoBandNextOLB[165] = 0;isoBandNextXBR[20] = isoBandNextXBR[150] = 0;isoBandNextYBR[20] = isoBandNextYBR[150] = 1;isoBandNextOBR[20] = isoBandNextOBR[150] = 1;isoBandNextXTR[20] = isoBandNextXTR[150] = 0;isoBandNextYTR[20] = isoBandNextYTR[150] = -1;isoBandNextOTR[20] = isoBandNextOTR[150] = 1;isoBandNextXRT[80] = isoBandNextXRT[90] = -1;isoBandNextYRT[80] = isoBandNextYRT[90] = 0;isoBandNextORT[80] = isoBandNextORT[90] = 1;isoBandNextXLT[80] = isoBandNextXLT[90] = 1;isoBandNextYLT[80] = isoBandNextYLT[90] = 0;isoBandNextOLT[80] = isoBandNextOLT[90] = 1;isoBandNextXBL[65] = isoBandNextXBL[105] = 0;isoBandNextYBL[65] = isoBandNextYBL[105] = 1;isoBandNextOBL[65] = isoBandNextOBL[105] = 0;isoBandNextXTL[65] = isoBandNextXTL[105] = 0;isoBandNextYTL[65] = isoBandNextYTL[105] = -1;isoBandNextOTL[65] = isoBandNextOTL[105] = 0;isoBandNextXRT[160] = isoBandNextXRT[10] = -1;isoBandNextYRT[160] = isoBandNextYRT[10] = 0;isoBandNextORT[160] = isoBandNextORT[10] = 1;isoBandNextXRB[160] = isoBandNextXRB[10] = -1;isoBandNextYRB[160] = isoBandNextYRB[10] = 0;isoBandNextORB[160] = isoBandNextORB[10] = 0;isoBandNextXLB[160] = isoBandNextXLB[10] = 1;isoBandNextYLB[160] = isoBandNextYLB[10] = 0;isoBandNextOLB[160] = isoBandNextOLB[10] = 0;isoBandNextXLT[160] = isoBandNextXLT[10] = 1;isoBandNextYLT[160] = isoBandNextYLT[10] = 0;isoBandNextOLT[160] = isoBandNextOLT[10] = 1;isoBandNextXBR[130] = isoBandNextXBR[40] = 0;isoBandNextYBR[130] = isoBandNextYBR[40] = 1;isoBandNextOBR[130] = isoBandNextOBR[40] = 1;isoBandNextXBL[130] = isoBandNextXBL[40] = 0;isoBandNextYBL[130] = isoBandNextYBL[40] = 1;isoBandNextOBL[130] = isoBandNextOBL[40] = 0;isoBandNextXTL[130] = isoBandNextXTL[40] = 0;isoBandNextYTL[130] = isoBandNextYTL[40] = -1;isoBandNextOTL[130] = isoBandNextOTL[40] = 0;isoBandNextXTR[130] = isoBandNextXTR[40] = 0;isoBandNextYTR[130] = isoBandNextYTR[40] = -1;isoBandNextOTR[130] = isoBandNextOTR[40] = 1;/* single hexagon cases */isoBandNextXRB[37] = isoBandNextXRB[133] = 0;isoBandNextYRB[37] = isoBandNextYRB[133] = 1;isoBandNextORB[37] = isoBandNextORB[133] = 1;isoBandNextXLB[37] = isoBandNextXLB[133] = 0;isoBandNextYLB[37] = isoBandNextYLB[133] = 1;isoBandNextOLB[37] = isoBandNextOLB[133] = 0;isoBandNextXTL[37] = isoBandNextXTL[133] = -1;isoBandNextYTL[37] = isoBandNextYTL[133] = 0;isoBandNextOTL[37] = isoBandNextOTL[133] = 0;isoBandNextXTR[37] = isoBandNextXTR[133] = 1;isoBandNextYTR[37] = isoBandNextYTR[133] = 0;isoBandNextOTR[37] = isoBandNextOTR[133] = 0;isoBandNextXBR[148] = isoBandNextXBR[22] = -1;isoBandNextYBR[148] = isoBandNextYBR[22] = 0;isoBandNextOBR[148] = isoBandNextOBR[22] = 0;isoBandNextXLB[148] = isoBandNextXLB[22] = 0;isoBandNextYLB[148] = isoBandNextYLB[22] = -1;isoBandNextOLB[148] = isoBandNextOLB[22] = 1;isoBandNextXLT[148] = isoBandNextXLT[22] = 0;isoBandNextYLT[148] = isoBandNextYLT[22] = 1;isoBandNextOLT[148] = isoBandNextOLT[22] = 1;isoBandNextXTR[148] = isoBandNextXTR[22] = -1;isoBandNextYTR[148] = isoBandNextYTR[22] = 0;isoBandNextOTR[148] = isoBandNextOTR[22] = 1;isoBandNextXRT[82] = isoBandNextXRT[88] = 0;isoBandNextYRT[82] = isoBandNextYRT[88] = -1;isoBandNextORT[82] = isoBandNextORT[88] = 1;isoBandNextXBR[82] = isoBandNextXBR[88] = 1;isoBandNextYBR[82] = isoBandNextYBR[88] = 0;isoBandNextOBR[82] = isoBandNextOBR[88] = 1;isoBandNextXBL[82] = isoBandNextXBL[88] = -1;isoBandNextYBL[82] = isoBandNextYBL[88] = 0;isoBandNextOBL[82] = isoBandNextOBL[88] = 1;isoBandNextXLT[82] = isoBandNextXLT[88] = 0;isoBandNextYLT[82] = isoBandNextYLT[88] = -1;isoBandNextOLT[82] = isoBandNextOLT[88] = 0;isoBandNextXRT[73] = isoBandNextXRT[97] = 0;isoBandNextYRT[73] = isoBandNextYRT[97] = 1;isoBandNextORT[73] = isoBandNextORT[97] = 0;isoBandNextXRB[73] = isoBandNextXRB[97] = 0;isoBandNextYRB[73] = isoBandNextYRB[97] = -1;isoBandNextORB[73] = isoBandNextORB[97] = 0;isoBandNextXBL[73] = isoBandNextXBL[97] = 1;isoBandNextYBL[73] = isoBandNextYBL[97] = 0;isoBandNextOBL[73] = isoBandNextOBL[97] = 0;isoBandNextXTL[73] = isoBandNextXTL[97] = 1;isoBandNextYTL[73] = isoBandNextYTL[97] = 0;isoBandNextOTL[73] = isoBandNextOTL[97] = 1;isoBandNextXRT[145] = isoBandNextXRT[25] = 0;isoBandNextYRT[145] = isoBandNextYRT[25] = -1;isoBandNextORT[145] = isoBandNextORT[25] = 0;isoBandNextXBL[145] = isoBandNextXBL[25] = 1;isoBandNextYBL[145] = isoBandNextYBL[25] = 0;isoBandNextOBL[145] = isoBandNextOBL[25] = 1;isoBandNextXLB[145] = isoBandNextXLB[25] = 0;isoBandNextYLB[145] = isoBandNextYLB[25] = 1;isoBandNextOLB[145] = isoBandNextOLB[25] = 1;isoBandNextXTR[145] = isoBandNextXTR[25] = -1;isoBandNextYTR[145] = isoBandNextYTR[25] = 0;isoBandNextOTR[145] = isoBandNextOTR[25] = 0;isoBandNextXRB[70] = isoBandNextXRB[100] = 0;isoBandNextYRB[70] = isoBandNextYRB[100] = 1;isoBandNextORB[70] = isoBandNextORB[100] = 0;isoBandNextXBR[70] = isoBandNextXBR[100] = -1;isoBandNextYBR[70] = isoBandNextYBR[100] = 0;isoBandNextOBR[70] = isoBandNextOBR[100] = 1;isoBandNextXLT[70] = isoBandNextXLT[100] = 0;isoBandNextYLT[70] = isoBandNextYLT[100] = -1;isoBandNextOLT[70] = isoBandNextOLT[100] = 1;isoBandNextXTL[70] = isoBandNextXTL[100] = 1;isoBandNextYTL[70] = isoBandNextYTL[100] = 0;isoBandNextOTL[70] = isoBandNextOTL[100] = 0;/* single pentagon cases */isoBandNextXRB[101] = isoBandNextXRB[69] = 0;isoBandNextYRB[101] = isoBandNextYRB[69] = 1;isoBandNextORB[101] = isoBandNextORB[69] = 0;isoBandNextXTL[101] = isoBandNextXTL[69] = 1;isoBandNextYTL[101] = isoBandNextYTL[69] = 0;isoBandNextOTL[101] = isoBandNextOTL[69] = 0;isoBandNextXLB[149] = isoBandNextXLB[21] = 0;isoBandNextYLB[149] = isoBandNextYLB[21] = 1;isoBandNextOLB[149] = isoBandNextOLB[21] = 1;isoBandNextXTR[149] = isoBandNextXTR[21] = -1;isoBandNextYTR[149] = isoBandNextYTR[21] = 0;isoBandNextOTR[149] = isoBandNextOTR[21] = 0;isoBandNextXBR[86] = isoBandNextXBR[84] = -1;isoBandNextYBR[86] = isoBandNextYBR[84] = 0;isoBandNextOBR[86] = isoBandNextOBR[84] = 1;isoBandNextXLT[86] = isoBandNextXLT[84] = 0;isoBandNextYLT[86] = isoBandNextYLT[84] = -1;isoBandNextOLT[86] = isoBandNextOLT[84] = 1;isoBandNextXRT[89] = isoBandNextXRT[81] = 0;isoBandNextYRT[89] = isoBandNextYRT[81] = -1;isoBandNextORT[89] = isoBandNextORT[81] = 0;isoBandNextXBL[89] = isoBandNextXBL[81] = 1;isoBandNextYBL[89] = isoBandNextYBL[81] = 0;isoBandNextOBL[89] = isoBandNextOBL[81] = 1;isoBandNextXRT[96] = isoBandNextXRT[74] = 0;isoBandNextYRT[96] = isoBandNextYRT[74] = 1;isoBandNextORT[96] = isoBandNextORT[74] = 0;isoBandNextXRB[96] = isoBandNextXRB[74] = -1;isoBandNextYRB[96] = isoBandNextYRB[74] = 0;isoBandNextORB[96] = isoBandNextORB[74] = 1;isoBandNextXLT[96] = isoBandNextXLT[74] = 1;isoBandNextYLT[96] = isoBandNextYLT[74] = 0;isoBandNextOLT[96] = isoBandNextOLT[74] = 0;isoBandNextXTL[96] = isoBandNextXTL[74] = 1;isoBandNextYTL[96] = isoBandNextYTL[74] = 0;isoBandNextOTL[96] = isoBandNextOTL[74] = 1;isoBandNextXRT[24] = isoBandNextXRT[146] = 0;isoBandNextYRT[24] = isoBandNextYRT[146] = -1;isoBandNextORT[24] = isoBandNextORT[146] = 1;isoBandNextXBR[24] = isoBandNextXBR[146] = 1;isoBandNextYBR[24] = isoBandNextYBR[146] = 0;isoBandNextOBR[24] = isoBandNextOBR[146] = 1;isoBandNextXBL[24] = isoBandNextXBL[146] = 0;isoBandNextYBL[24] = isoBandNextYBL[146] = 1;isoBandNextOBL[24] = isoBandNextOBL[146] = 1;isoBandNextXTR[24] = isoBandNextXTR[146] = 0;isoBandNextYTR[24] = isoBandNextYTR[146] = -1;isoBandNextOTR[24] = isoBandNextOTR[146] = 0;isoBandNextXRB[6] = isoBandNextXRB[164] = -1;isoBandNextYRB[6] = isoBandNextYRB[164] = 0;isoBandNextORB[6] = isoBandNextORB[164] = 1;isoBandNextXBR[6] = isoBandNextXBR[164] = -1;isoBandNextYBR[6] = isoBandNextYBR[164] = 0;isoBandNextOBR[6] = isoBandNextOBR[164] = 0;isoBandNextXLB[6] = isoBandNextXLB[164] = 0;isoBandNextYLB[6] = isoBandNextYLB[164] = -1;isoBandNextOLB[6] = isoBandNextOLB[164] = 1;isoBandNextXLT[6] = isoBandNextXLT[164] = 1;isoBandNextYLT[6] = isoBandNextYLT[164] = 0;isoBandNextOLT[6] = isoBandNextOLT[164] = 0;isoBandNextXBL[129] = isoBandNextXBL[41] = 0;isoBandNextYBL[129] = isoBandNextYBL[41] = 1;isoBandNextOBL[129] = isoBandNextOBL[41] = 1;isoBandNextXLB[129] = isoBandNextXLB[41] = 0;isoBandNextYLB[129] = isoBandNextYLB[41] = 1;isoBandNextOLB[129] = isoBandNextOLB[41] = 0;isoBandNextXTL[129] = isoBandNextXTL[41] = -1;isoBandNextYTL[129] = isoBandNextYTL[41] = 0;isoBandNextOTL[129] = isoBandNextOTL[41] = 0;isoBandNextXTR[129] = isoBandNextXTR[41] = 0;isoBandNextYTR[129] = isoBandNextYTR[41] = -1;isoBandNextOTR[129] = isoBandNextOTR[41] = 0;isoBandNextXBR[66] = isoBandNextXBR[104] = 0;isoBandNextYBR[66] = isoBandNextYBR[104] = 1;isoBandNextOBR[66] = isoBandNextOBR[104] = 0;isoBandNextXBL[66] = isoBandNextXBL[104] = -1;isoBandNextYBL[66] = isoBandNextYBL[104] = 0;isoBandNextOBL[66] = isoBandNextOBL[104] = 1;isoBandNextXLT[66] = isoBandNextXLT[104] = 0;isoBandNextYLT[66] = isoBandNextYLT[104] = -1;isoBandNextOLT[66] = isoBandNextOLT[104] = 0;isoBandNextXTL[66] = isoBandNextXTL[104] = 0;isoBandNextYTL[66] = isoBandNextYTL[104] = -1;isoBandNextOTL[66] = isoBandNextOTL[104] = 1;isoBandNextXRT[144] = isoBandNextXRT[26] = -1;isoBandNextYRT[144] = isoBandNextYRT[26] = 0;isoBandNextORT[144] = isoBandNextORT[26] = 0;isoBandNextXLB[144] = isoBandNextXLB[26] = 1;isoBandNextYLB[144] = isoBandNextYLB[26] = 0;isoBandNextOLB[144] = isoBandNextOLB[26] = 1;isoBandNextXLT[144] = isoBandNextXLT[26] = 0;isoBandNextYLT[144] = isoBandNextYLT[26] = 1;isoBandNextOLT[144] = isoBandNextOLT[26] = 1;isoBandNextXTR[144] = isoBandNextXTR[26] = -1;isoBandNextYTR[144] = isoBandNextYTR[26] = 0;isoBandNextOTR[144] = isoBandNextOTR[26] = 1;isoBandNextXRB[36] = isoBandNextXRB[134] = 0;isoBandNextYRB[36] = isoBandNextYRB[134] = 1;isoBandNextORB[36] = isoBandNextORB[134] = 1;isoBandNextXBR[36] = isoBandNextXBR[134] = 0;isoBandNextYBR[36] = isoBandNextYBR[134] = 1;isoBandNextOBR[36] = isoBandNextOBR[134] = 0;isoBandNextXTL[36] = isoBandNextXTL[134] = 0;isoBandNextYTL[36] = isoBandNextYTL[134] = -1;isoBandNextOTL[36] = isoBandNextOTL[134] = 1;isoBandNextXTR[36] = isoBandNextXTR[134] = 1;isoBandNextYTR[36] = isoBandNextYTR[134] = 0;isoBandNextOTR[36] = isoBandNextOTR[134] = 0;isoBandNextXRT[9] = isoBandNextXRT[161] = -1;isoBandNextYRT[9] = isoBandNextYRT[161] = 0;isoBandNextORT[9] = isoBandNextORT[161] = 0;isoBandNextXRB[9] = isoBandNextXRB[161] = 0;isoBandNextYRB[9] = isoBandNextYRB[161] = -1;isoBandNextORB[9] = isoBandNextORB[161] = 0;isoBandNextXBL[9] = isoBandNextXBL[161] = 1;isoBandNextYBL[9] = isoBandNextYBL[161] = 0;isoBandNextOBL[9] = isoBandNextOBL[161] = 0;isoBandNextXLB[9] = isoBandNextXLB[161] = 1;isoBandNextYLB[9] = isoBandNextYLB[161] = 0;isoBandNextOLB[9] = isoBandNextOLB[161] = 1;/* 8-sided cases */isoBandNextXRT[136] = 0;isoBandNextYRT[136] = 1;isoBandNextORT[136] = 1;isoBandNextXRB[136] = 0;isoBandNextYRB[136] = 1;isoBandNextORB[136] = 0;isoBandNextXBR[136] = -1;isoBandNextYBR[136] = 0;isoBandNextOBR[136] = 1;isoBandNextXBL[136] = -1;isoBandNextYBL[136] = 0;isoBandNextOBL[136] = 0;isoBandNextXLB[136] = 0;isoBandNextYLB[136] = -1;isoBandNextOLB[136] = 0;isoBandNextXLT[136] = 0;isoBandNextYLT[136] = -1;isoBandNextOLT[136] = 1;isoBandNextXTL[136] = 1;isoBandNextYTL[136] = 0;isoBandNextOTL[136] = 0;isoBandNextXTR[136] = 1;isoBandNextYTR[136] = 0;isoBandNextOTR[136] = 1;isoBandNextXRT[34] = 0;isoBandNextYRT[34] = -1;isoBandNextORT[34] = 0;isoBandNextXRB[34] = 0;isoBandNextYRB[34] = -1;isoBandNextORB[34] = 1;isoBandNextXBR[34] = 1;isoBandNextYBR[34] = 0;isoBandNextOBR[34] = 0;isoBandNextXBL[34] = 1;isoBandNextYBL[34] = 0;isoBandNextOBL[34] = 1;isoBandNextXLB[34] = 0;isoBandNextYLB[34] = 1;isoBandNextOLB[34] = 1;isoBandNextXLT[34] = 0;isoBandNextYLT[34] = 1;isoBandNextOLT[34] = 0;isoBandNextXTL[34] = -1;isoBandNextYTL[34] = 0;isoBandNextOTL[34] = 1;isoBandNextXTR[34] = -1;isoBandNextYTR[34] = 0;isoBandNextOTR[34] = 0;isoBandNextXRT[35] = 0;isoBandNextYRT[35] = 1;isoBandNextORT[35] = 1;isoBandNextXRB[35] = 0;isoBandNextYRB[35] = -1;isoBandNextORB[35] = 1;isoBandNextXBR[35] = 1;isoBandNextYBR[35] = 0;isoBandNextOBR[35] = 0;isoBandNextXBL[35] = -1;isoBandNextYBL[35] = 0;isoBandNextOBL[35] = 0;isoBandNextXLB[35] = 0;isoBandNextYLB[35] = -1;isoBandNextOLB[35] = 0;isoBandNextXLT[35] = 0;isoBandNextYLT[35] = 1;isoBandNextOLT[35] = 0;isoBandNextXTL[35] = -1;isoBandNextYTL[35] = 0;isoBandNextOTL[35] = 1;isoBandNextXTR[35] = 1;isoBandNextYTR[35] = 0;isoBandNextOTR[35] = 1;/* 6-sided cases */isoBandNextXRT[153] = 0;isoBandNextYRT[153] = 1;isoBandNextORT[153] = 1;isoBandNextXBL[153] = -1;isoBandNextYBL[153] = 0;isoBandNextOBL[153] = 0;isoBandNextXLB[153] = 0;isoBandNextYLB[153] = -1;isoBandNextOLB[153] = 0;isoBandNextXTR[153] = 1;isoBandNextYTR[153] = 0;isoBandNextOTR[153] = 1;isoBandNextXRB[102] = 0;isoBandNextYRB[102] = -1;isoBandNextORB[102] = 1;isoBandNextXBR[102] = 1;isoBandNextYBR[102] = 0;isoBandNextOBR[102] = 0;isoBandNextXLT[102] = 0;isoBandNextYLT[102] = 1;isoBandNextOLT[102] = 0;isoBandNextXTL[102] = -1;isoBandNextYTL[102] = 0;isoBandNextOTL[102] = 1;isoBandNextXRT[155] = 0;isoBandNextYRT[155] = -1;isoBandNextORT[155] = 0;isoBandNextXBL[155] = 1;isoBandNextYBL[155] = 0;isoBandNextOBL[155] = 1;isoBandNextXLB[155] = 0;isoBandNextYLB[155] = 1;isoBandNextOLB[155] = 1;isoBandNextXTR[155] = -1;isoBandNextYTR[155] = 0;isoBandNextOTR[155] = 0;isoBandNextXRB[103] = 0;isoBandNextYRB[103] = 1;isoBandNextORB[103] = 0;isoBandNextXBR[103] = -1;isoBandNextYBR[103] = 0;isoBandNextOBR[103] = 1;isoBandNextXLT[103] = 0;isoBandNextYLT[103] = -1;isoBandNextOLT[103] = 1;isoBandNextXTL[103] = 1;isoBandNextYTL[103] = 0;isoBandNextOTL[103] = 0;/* 7-sided cases */isoBandNextXRT[152] = 0;isoBandNextYRT[152] = 1;isoBandNextORT[152] = 1;isoBandNextXBR[152] = -1;isoBandNextYBR[152] = 0;isoBandNextOBR[152] = 1;isoBandNextXBL[152] = -1;isoBandNextYBL[152] = 0;isoBandNextOBL[152] = 0;isoBandNextXLB[152] = 0;isoBandNextYLB[152] = -1;isoBandNextOLB[152] = 0;isoBandNextXLT[152] = 0;isoBandNextYLT[152] = -1;isoBandNextOLT[152] = 1;isoBandNextXTR[152] = 1;isoBandNextYTR[152] = 0;isoBandNextOTR[152] = 1;isoBandNextXRT[156] = 0;isoBandNextYRT[156] = -1;isoBandNextORT[156] = 1;isoBandNextXBR[156] = 1;isoBandNextYBR[156] = 0;isoBandNextOBR[156] = 1;isoBandNextXBL[156] = -1;isoBandNextYBL[156] = 0;isoBandNextOBL[156] = 0;isoBandNextXLB[156] = 0;isoBandNextYLB[156] = -1;isoBandNextOLB[156] = 0;isoBandNextXLT[156] = 0;isoBandNextYLT[156] = 1;isoBandNextOLT[156] = 1;isoBandNextXTR[156] = -1;isoBandNextYTR[156] = 0;isoBandNextOTR[156] = 1;isoBandNextXRT[137] = 0;isoBandNextYRT[137] = 1;isoBandNextORT[137] = 1;isoBandNextXRB[137] = 0;isoBandNextYRB[137] = 1;isoBandNextORB[137] = 0;isoBandNextXBL[137] = -1;isoBandNextYBL[137] = 0;isoBandNextOBL[137] = 0;isoBandNextXLB[137] = 0;isoBandNextYLB[137] = -1;isoBandNextOLB[137] = 0;isoBandNextXTL[137] = 1;isoBandNextYTL[137] = 0;isoBandNextOTL[137] = 0;isoBandNextXTR[137] = 1;isoBandNextYTR[137] = 0;isoBandNextOTR[137] = 1;isoBandNextXRT[139] = 0;isoBandNextYRT[139] = 1;isoBandNextORT[139] = 1;isoBandNextXRB[139] = 0;isoBandNextYRB[139] = -1;isoBandNextORB[139] = 0;isoBandNextXBL[139] = 1;isoBandNextYBL[139] = 0;isoBandNextOBL[139] = 0;isoBandNextXLB[139] = 0;isoBandNextYLB[139] = 1;isoBandNextOLB[139] = 0;isoBandNextXTL[139] = -1;isoBandNextYTL[139] = 0;isoBandNextOTL[139] = 0;isoBandNextXTR[139] = 1;isoBandNextYTR[139] = 0;isoBandNextOTR[139] = 1;isoBandNextXRT[98] = 0;isoBandNextYRT[98] = -1;isoBandNextORT[98] = 0;isoBandNextXRB[98] = 0;isoBandNextYRB[98] = -1;isoBandNextORB[98] = 1;isoBandNextXBR[98] = 1;isoBandNextYBR[98] = 0;isoBandNextOBR[98] = 0;isoBandNextXBL[98] = 1;isoBandNextYBL[98] = 0;isoBandNextOBL[98] = 1;isoBandNextXLT[98] = 0;isoBandNextYLT[98] = 1;isoBandNextOLT[98] = 0;isoBandNextXTL[98] = -1;isoBandNextYTL[98] = 0;isoBandNextOTL[98] = 1;isoBandNextXRT[99] = 0;isoBandNextYRT[99] = 1;isoBandNextORT[99] = 0;isoBandNextXRB[99] = 0;isoBandNextYRB[99] = -1;isoBandNextORB[99] = 1;isoBandNextXBR[99] = 1;isoBandNextYBR[99] = 0;isoBandNextOBR[99] = 0;isoBandNextXBL[99] = -1;isoBandNextYBL[99] = 0;isoBandNextOBL[99] = 1;isoBandNextXLT[99] = 0;isoBandNextYLT[99] = -1;isoBandNextOLT[99] = 0;isoBandNextXTL[99] = 1;isoBandNextYTL[99] = 0;isoBandNextOTL[99] = 1;isoBandNextXRB[38] = 0;isoBandNextYRB[38] = -1;isoBandNextORB[38] = 1;isoBandNextXBR[38] = 1;isoBandNextYBR[38] = 0;isoBandNextOBR[38] = 0;isoBandNextXLB[38] = 0;isoBandNextYLB[38] = 1;isoBandNextOLB[38] = 1;isoBandNextXLT[38] = 0;isoBandNextYLT[38] = 1;isoBandNextOLT[38] = 0;isoBandNextXTL[38] = -1;isoBandNextYTL[38] = 0;isoBandNextOTL[38] = 1;isoBandNextXTR[38] = -1;isoBandNextYTR[38] = 0;isoBandNextOTR[38] = 0;isoBandNextXRB[39] = 0;isoBandNextYRB[39] = 1;isoBandNextORB[39] = 1;isoBandNextXBR[39] = -1;isoBandNextYBR[39] = 0;isoBandNextOBR[39] = 0;isoBandNextXLB[39] = 0;isoBandNextYLB[39] = -1;isoBandNextOLB[39] = 1;isoBandNextXLT[39] = 0;isoBandNextYLT[39] = 1;isoBandNextOLT[39] = 0;isoBandNextXTL[39] = -1;isoBandNextYTL[39] = 0;isoBandNextOTL[39] = 1;isoBandNextXTR[39] = 1;isoBandNextYTR[39] = 0;isoBandNextOTR[39] = 0;/*  Define helper functions for the polygon_table  *//* triangle cases */var p00 = function (cell) {  return [    [cell.bottomleft, 0],    [0, 0],    [0, cell.leftbottom],  ];};var p01 = function (cell) {  return [    [1, cell.rightbottom],    [1, 0],    [cell.bottomright, 0],  ];};var p02 = function (cell) {  return [    [cell.topright, 1],    [1, 1],    [1, cell.righttop],  ];};var p03 = function (cell) {  return [    [0, cell.lefttop],    [0, 1],    [cell.topleft, 1],  ];};/* trapezoid cases */var p04 = function (cell) {  return [    [cell.bottomright, 0],    [cell.bottomleft, 0],    [0, cell.leftbottom],    [0, cell.lefttop],  ];};var p05 = function (cell) {  return [    [cell.bottomright, 0],    [cell.bottomleft, 0],    [1, cell.righttop],    [1, cell.rightbottom],  ];};var p06 = function (cell) {  return [    [1, cell.righttop],    [1, cell.rightbottom],    [cell.topleft, 1],    [cell.topright, 1],  ];};var p07 = function (cell) {  return [    [0, cell.leftbottom],    [0, cell.lefttop],    [cell.topleft, 1],    [cell.topright, 1],  ];};/* rectangle cases */var p08 = function (cell) {  return [    [0, 0],    [0, cell.leftbottom],    [1, cell.rightbottom],    [1, 0],  ];};var p09 = function (cell) {  return [    [1, 0],    [cell.bottomright, 0],    [cell.topright, 1],    [1, 1],  ];};var p10 = function (cell) {  return [    [1, 1],    [1, cell.righttop],    [0, cell.lefttop],    [0, 1],  ];};var p11 = function (cell) {  return [    [cell.bottomleft, 0],    [0, 0],    [0, 1],    [cell.topleft, 1],  ];};var p12 = function (cell) {  return [    [1, cell.righttop],    [1, cell.rightbottom],    [0, cell.leftbottom],    [0, cell.lefttop],  ];};var p13 = function (cell) {  return [    [cell.topleft, 1],    [cell.topright, 1],    [cell.bottomright, 0],    [cell.bottomleft, 0],  ];};/* square case */var p14 = function () {  return [    [0, 0],    [0, 1],    [1, 1],    [1, 0],  ];};/* pentagon cases */var p15 = function (cell) {  return [    [1, cell.rightbottom],    [1, 0],    [0, 0],    [0, 1],    [cell.topleft, 1],  ];};/* 1211 || 1011 */var p16 = function (cell) {  return [    [cell.topright, 1],    [1, 1],    [1, 0],    [0, 0],    [0, cell.leftbottom],  ];};/* 2111 || 0111 */var p17 = function (cell) {  return [    [1, 0],    [cell.bottomright, 0],    [0, cell.lefttop],    [0, 1],    [1, 1],  ];};/* 1112 || 1110 */var p18 = function (cell) {  return [    [1, 1],    [1, cell.righttop],    [cell.bottomleft, 0],    [0, 0],    [0, 1],  ];};/* 1121 || 1101 */var p19 = function (cell) {  return [    [1, cell.righttop],    [1, cell.rightbottom],    [0, cell.lefttop],    [0, 1],    [cell.topleft, 1],  ];};/* 1200 || 1022 */var p20 = function (cell) {  return [    [1, 1],    [1, cell.righttop],    [cell.bottomright, 0],    [cell.bottomleft, 0],    [cell.topright, 1],  ];};/* 0120 || 2102 */var p21 = function (cell) {  return [    [1, cell.rightbottom],    [1, 0],    [cell.bottomright, 0],    [0, cell.leftbottom],    [0, cell.lefttop],  ];};/* 0012 || 2210 */var p22 = function (cell) {  return [    [cell.topright, 1],    [cell.bottomleft, 0],    [0, 0],    [0, cell.leftbottom],    [cell.topleft, 1],  ];};/* 2001 || 0221 */var p23 = function (cell) {  return [    [cell.bottomright, 0],    [cell.bottomleft, 0],    [0, cell.lefttop],    [0, 1],    [cell.topleft, 1],  ];};/* 1002 || 1220 */var p24 = function (cell) {  return [    [1, 1],    [1, cell.righttop],    [0, cell.leftbottom],    [0, cell.lefttop],    [cell.topright, 1],  ];};/* 2100 || 0122 */var p25 = function (cell) {  return [    [1, cell.rightbottom],    [1, 0],    [cell.bottomright, 0],    [cell.topleft, 1],    [cell.topright, 1],  ];};/* 0210 || 2012 */var p26 = function (cell) {  return [    [1, cell.righttop],    [1, cell.rightbottom],    [cell.bottomleft, 0],    [0, 0],    [0, cell.leftbottom],  ];};/* 0021 || 2201 *//*hexagon cases */var p27 = function (cell) {  return [    [1, cell.rightbottom],    [1, 0],    [0, 0],    [0, cell.leftbottom],    [cell.topleft, 1],    [cell.topright, 1],  ];};/* 0211 || 2011 */var p28 = function (cell) {  return [    [1, 1],    [1, 0],    [cell.bottomright, 0],    [0, cell.leftbottom],    [0, cell.lefttop],    [cell.topright, 1],  ];};/* 2110 || 0112 */var p29 = function (cell) {  return [    [1, 1],    [1, cell.righttop],    [cell.bottomright, 0],    [cell.bottomleft, 0],    [0, cell.lefttop],    [0, 1],  ];};/* 1102 || 1120 */var p30 = function (cell) {  return [    [1, cell.righttop],    [1, cell.rightbottom],    [cell.bottomleft, 0],    [0, 0],    [0, 1],    [cell.topleft, 1],  ];};/* 1021 || 1201 */var p31 = function (cell) {  return [    [1, 1],    [1, cell.righttop],    [cell.bottomleft, 0],    [0, 0],    [0, cell.leftbottom],    [cell.topright, 1],  ];};/* 2101 || 0121 */var p32 = function (cell) {  return [    [1, cell.rightbottom],    [1, 0],    [cell.bottomright, 0],    [0, cell.lefttop],    [0, 1],    [cell.topleft, 1],  ];};/* 1012 || 1210 *//* 8-sided cases */var p33 = function (cell) {  return [    [1, cell.righttop],    [1, cell.rightbottom],    [cell.bottomright, 0],    [cell.bottomleft, 0],    [0, cell.leftbottom],    [0, cell.lefttop],    [cell.topleft, 1],    [cell.topright, 1],  ];};/* flipped == 1 state for 0202 and 2020 *//* 6-sided cases */var p34 = function (cell) {  return [    [1, 1],    [1, cell.righttop],    [cell.bottomleft, 0],    [0, 0],    [0, cell.leftbottom],    [cell.topright, 1],  ];};/* 0101 with flipped == 1 || 2121 with flipped == 1 */var p35 = function (cell) {  return [    [1, cell.rightbottom],    [1, 0],    [cell.bottomright, 0],    [0, cell.lefttop],    [0, 1],    [cell.topleft, 1],  ];};/* 1010 with flipped == 1 || 1212 with flipped == 1 *//* 7-sided cases */var p36 = function (cell) {  return [    [1, 1],    [1, cell.righttop],    [cell.bottomright, 0],    [cell.bottomleft, 0],    [0, cell.leftbottom],    [0, cell.lefttop],    [cell.topright, 1],  ];};/* 2120 with flipped == 1 || 0102 with flipped == 1 */var p37 = function (cell) {  return [    [1, cell.righttop],    [1, cell.rightbottom],    [cell.bottomleft, 0],    [0, 0],    [0, cell.leftbottom],    [cell.topleft, 1],    [cell.topright, 1],  ];};/* 2021 with flipped == 1 || 0201 with flipped == 1 */var p38 = function (cell) {  return [    [1, cell.righttop],    [1, cell.rightbottom],    [cell.bottomright, 0],    [cell.bottomleft, 0],    [0, cell.lefttop],    [0, 1],    [cell.topleft, 1],  ];};/* 1202 with flipped == 1 || 1020 with flipped == 1 */var p39 = function (cell) {  return [    [1, cell.rightbottom],    [1, 0],    [cell.bottomright, 0],    [0, cell.leftbottom],    [0, cell.lefttop],    [cell.topleft, 1],    [cell.topright, 1],  ];};/* 0212 with flipped == 1 || 2010 with flipped == 1 *//*  The lookup tables for edge number given the polygon  is entered at a specific location*/var isoBandEdgeRT = [];var isoBandEdgeRB = [];var isoBandEdgeBR = [];var isoBandEdgeBL = [];var isoBandEdgeLB = [];var isoBandEdgeLT = [];var isoBandEdgeTL = [];var isoBandEdgeTR = [];/* triangle cases */isoBandEdgeBL[1] = isoBandEdgeLB[1] = 18;isoBandEdgeBL[169] = isoBandEdgeLB[169] = 18;isoBandEdgeBR[4] = isoBandEdgeRB[4] = 12;isoBandEdgeBR[166] = isoBandEdgeRB[166] = 12;isoBandEdgeRT[16] = isoBandEdgeTR[16] = 4;isoBandEdgeRT[154] = isoBandEdgeTR[154] = 4;isoBandEdgeLT[64] = isoBandEdgeTL[64] = 22;isoBandEdgeLT[106] = isoBandEdgeTL[106] = 22;/* trapezoid cases */isoBandEdgeBR[2] = isoBandEdgeLT[2] = 17;isoBandEdgeBL[2] = isoBandEdgeLB[2] = 18;isoBandEdgeBR[168] = isoBandEdgeLT[168] = 17;isoBandEdgeBL[168] = isoBandEdgeLB[168] = 18;isoBandEdgeRT[8] = isoBandEdgeBL[8] = 9;isoBandEdgeRB[8] = isoBandEdgeBR[8] = 12;isoBandEdgeRT[162] = isoBandEdgeBL[162] = 9;isoBandEdgeRB[162] = isoBandEdgeBR[162] = 12;isoBandEdgeRT[32] = isoBandEdgeTR[32] = 4;isoBandEdgeRB[32] = isoBandEdgeTL[32] = 1;isoBandEdgeRT[138] = isoBandEdgeTR[138] = 4;isoBandEdgeRB[138] = isoBandEdgeTL[138] = 1;isoBandEdgeLB[128] = isoBandEdgeTR[128] = 21;isoBandEdgeLT[128] = isoBandEdgeTL[128] = 22;isoBandEdgeLB[42] = isoBandEdgeTR[42] = 21;isoBandEdgeLT[42] = isoBandEdgeTL[42] = 22;/* rectangle cases */isoBandEdgeRB[5] = isoBandEdgeLB[5] = 14;isoBandEdgeRB[165] = isoBandEdgeLB[165] = 14;isoBandEdgeBR[20] = isoBandEdgeTR[20] = 6;isoBandEdgeBR[150] = isoBandEdgeTR[150] = 6;isoBandEdgeRT[80] = isoBandEdgeLT[80] = 11;isoBandEdgeRT[90] = isoBandEdgeLT[90] = 11;isoBandEdgeBL[65] = isoBandEdgeTL[65] = 3;isoBandEdgeBL[105] = isoBandEdgeTL[105] = 3;isoBandEdgeRT[160] = isoBandEdgeLT[160] = 11;isoBandEdgeRB[160] = isoBandEdgeLB[160] = 14;isoBandEdgeRT[10] = isoBandEdgeLT[10] = 11;isoBandEdgeRB[10] = isoBandEdgeLB[10] = 14;isoBandEdgeBR[130] = isoBandEdgeTR[130] = 6;isoBandEdgeBL[130] = isoBandEdgeTL[130] = 3;isoBandEdgeBR[40] = isoBandEdgeTR[40] = 6;isoBandEdgeBL[40] = isoBandEdgeTL[40] = 3;/* pentagon cases */isoBandEdgeRB[101] = isoBandEdgeTL[101] = 1;isoBandEdgeRB[69] = isoBandEdgeTL[69] = 1;isoBandEdgeLB[149] = isoBandEdgeTR[149] = 21;isoBandEdgeLB[21] = isoBandEdgeTR[21] = 21;isoBandEdgeBR[86] = isoBandEdgeLT[86] = 17;isoBandEdgeBR[84] = isoBandEdgeLT[84] = 17;isoBandEdgeRT[89] = isoBandEdgeBL[89] = 9;isoBandEdgeRT[81] = isoBandEdgeBL[81] = 9;isoBandEdgeRT[96] = isoBandEdgeTL[96] = 0;isoBandEdgeRB[96] = isoBandEdgeLT[96] = 15;isoBandEdgeRT[74] = isoBandEdgeTL[74] = 0;isoBandEdgeRB[74] = isoBandEdgeLT[74] = 15;isoBandEdgeRT[24] = isoBandEdgeBR[24] = 8;isoBandEdgeBL[24] = isoBandEdgeTR[24] = 7;isoBandEdgeRT[146] = isoBandEdgeBR[146] = 8;isoBandEdgeBL[146] = isoBandEdgeTR[146] = 7;isoBandEdgeRB[6] = isoBandEdgeLT[6] = 15;isoBandEdgeBR[6] = isoBandEdgeLB[6] = 16;isoBandEdgeRB[164] = isoBandEdgeLT[164] = 15;isoBandEdgeBR[164] = isoBandEdgeLB[164] = 16;isoBandEdgeBL[129] = isoBandEdgeTR[129] = 7;isoBandEdgeLB[129] = isoBandEdgeTL[129] = 20;isoBandEdgeBL[41] = isoBandEdgeTR[41] = 7;isoBandEdgeLB[41] = isoBandEdgeTL[41] = 20;isoBandEdgeBR[66] = isoBandEdgeTL[66] = 2;isoBandEdgeBL[66] = isoBandEdgeLT[66] = 19;isoBandEdgeBR[104] = isoBandEdgeTL[104] = 2;isoBandEdgeBL[104] = isoBandEdgeLT[104] = 19;isoBandEdgeRT[144] = isoBandEdgeLB[144] = 10;isoBandEdgeLT[144] = isoBandEdgeTR[144] = 23;isoBandEdgeRT[26] = isoBandEdgeLB[26] = 10;isoBandEdgeLT[26] = isoBandEdgeTR[26] = 23;isoBandEdgeRB[36] = isoBandEdgeTR[36] = 5;isoBandEdgeBR[36] = isoBandEdgeTL[36] = 2;isoBandEdgeRB[134] = isoBandEdgeTR[134] = 5;isoBandEdgeBR[134] = isoBandEdgeTL[134] = 2;isoBandEdgeRT[9] = isoBandEdgeLB[9] = 10;isoBandEdgeRB[9] = isoBandEdgeBL[9] = 13;isoBandEdgeRT[161] = isoBandEdgeLB[161] = 10;isoBandEdgeRB[161] = isoBandEdgeBL[161] = 13;/* hexagon cases */isoBandEdgeRB[37] = isoBandEdgeTR[37] = 5;isoBandEdgeLB[37] = isoBandEdgeTL[37] = 20;isoBandEdgeRB[133] = isoBandEdgeTR[133] = 5;isoBandEdgeLB[133] = isoBandEdgeTL[133] = 20;isoBandEdgeBR[148] = isoBandEdgeLB[148] = 16;isoBandEdgeLT[148] = isoBandEdgeTR[148] = 23;isoBandEdgeBR[22] = isoBandEdgeLB[22] = 16;isoBandEdgeLT[22] = isoBandEdgeTR[22] = 23;isoBandEdgeRT[82] = isoBandEdgeBR[82] = 8;isoBandEdgeBL[82] = isoBandEdgeLT[82] = 19;isoBandEdgeRT[88] = isoBandEdgeBR[88] = 8;isoBandEdgeBL[88] = isoBandEdgeLT[88] = 19;isoBandEdgeRT[73] = isoBandEdgeTL[73] = 0;isoBandEdgeRB[73] = isoBandEdgeBL[73] = 13;isoBandEdgeRT[97] = isoBandEdgeTL[97] = 0;isoBandEdgeRB[97] = isoBandEdgeBL[97] = 13;isoBandEdgeRT[145] = isoBandEdgeBL[145] = 9;isoBandEdgeLB[145] = isoBandEdgeTR[145] = 21;isoBandEdgeRT[25] = isoBandEdgeBL[25] = 9;isoBandEdgeLB[25] = isoBandEdgeTR[25] = 21;isoBandEdgeRB[70] = isoBandEdgeTL[70] = 1;isoBandEdgeBR[70] = isoBandEdgeLT[70] = 17;isoBandEdgeRB[100] = isoBandEdgeTL[100] = 1;isoBandEdgeBR[100] = isoBandEdgeLT[100] = 17;/* 8-sided cases */isoBandEdgeRT[34] = isoBandEdgeBL[34] = 9;isoBandEdgeRB[34] = isoBandEdgeBR[34] = 12;isoBandEdgeLB[34] = isoBandEdgeTR[34] = 21;isoBandEdgeLT[34] = isoBandEdgeTL[34] = 22;isoBandEdgeRT[136] = isoBandEdgeTR[136] = 4;isoBandEdgeRB[136] = isoBandEdgeTL[136] = 1;isoBandEdgeBR[136] = isoBandEdgeLT[136] = 17;isoBandEdgeBL[136] = isoBandEdgeLB[136] = 18;isoBandEdgeRT[35] = isoBandEdgeTR[35] = 4;isoBandEdgeRB[35] = isoBandEdgeBR[35] = 12;isoBandEdgeBL[35] = isoBandEdgeLB[35] = 18;isoBandEdgeLT[35] = isoBandEdgeTL[35] = 22;/* 6-sided cases */isoBandEdgeRT[153] = isoBandEdgeTR[153] = 4;isoBandEdgeBL[153] = isoBandEdgeLB[153] = 18;isoBandEdgeRB[102] = isoBandEdgeBR[102] = 12;isoBandEdgeLT[102] = isoBandEdgeTL[102] = 22;isoBandEdgeRT[155] = isoBandEdgeBL[155] = 9;isoBandEdgeLB[155] = isoBandEdgeTR[155] = 23;isoBandEdgeRB[103] = isoBandEdgeTL[103] = 1;isoBandEdgeBR[103] = isoBandEdgeLT[103] = 17;/* 7-sided cases */isoBandEdgeRT[152] = isoBandEdgeTR[152] = 4;isoBandEdgeBR[152] = isoBandEdgeLT[152] = 17;isoBandEdgeBL[152] = isoBandEdgeLB[152] = 18;isoBandEdgeRT[156] = isoBandEdgeBR[156] = 8;isoBandEdgeBL[156] = isoBandEdgeLB[156] = 18;isoBandEdgeLT[156] = isoBandEdgeTR[156] = 23;isoBandEdgeRT[137] = isoBandEdgeTR[137] = 4;isoBandEdgeRB[137] = isoBandEdgeTL[137] = 1;isoBandEdgeBL[137] = isoBandEdgeLB[137] = 18;isoBandEdgeRT[139] = isoBandEdgeTR[139] = 4;isoBandEdgeRB[139] = isoBandEdgeBL[139] = 13;isoBandEdgeLB[139] = isoBandEdgeTL[139] = 20;isoBandEdgeRT[98] = isoBandEdgeBL[98] = 9;isoBandEdgeRB[98] = isoBandEdgeBR[98] = 12;isoBandEdgeLT[98] = isoBandEdgeTL[98] = 22;isoBandEdgeRT[99] = isoBandEdgeTL[99] = 0;isoBandEdgeRB[99] = isoBandEdgeBR[99] = 12;isoBandEdgeBL[99] = isoBandEdgeLT[99] = 19;isoBandEdgeRB[38] = isoBandEdgeBR[38] = 12;isoBandEdgeLB[38] = isoBandEdgeTR[38] = 21;isoBandEdgeLT[38] = isoBandEdgeTL[38] = 22;isoBandEdgeRB[39] = isoBandEdgeTR[39] = 5;isoBandEdgeBR[39] = isoBandEdgeLB[39] = 16;isoBandEdgeLT[39] = isoBandEdgeTL[39] = 22;/*  The lookup tables for all different polygons that  may appear within a grid cell*/var polygon_table = [];/* triangle cases */polygon_table[1] = polygon_table[169] = p00; /* 2221 || 0001 */polygon_table[4] = polygon_table[166] = p01; /* 2212 || 0010 */polygon_table[16] = polygon_table[154] = p02; /* 2122 || 0100 */polygon_table[64] = polygon_table[106] = p03; /* 1222 || 1000 *//* trapezoid cases */polygon_table[168] = polygon_table[2] = p04; /* 2220 || 0002 */polygon_table[162] = polygon_table[8] = p05; /* 2202 || 0020 */polygon_table[138] = polygon_table[32] = p06; /* 2022 || 0200 */polygon_table[42] = polygon_table[128] = p07; /* 0222 || 2000 *//* rectangle cases */polygon_table[5] = polygon_table[165] = p08; /* 0011 || 2211 */polygon_table[20] = polygon_table[150] = p09; /* 0110 || 2112 */polygon_table[80] = polygon_table[90] = p10; /* 1100 || 1122 */polygon_table[65] = polygon_table[105] = p11; /* 1001 || 1221 */polygon_table[160] = polygon_table[10] = p12; /* 2200 || 0022 */polygon_table[130] = polygon_table[40] = p13; /* 2002 || 0220 *//* square case */polygon_table[85] = p14; /* 1111 *//* pentagon cases */polygon_table[101] = polygon_table[69] = p15; /* 1211 || 1011 */polygon_table[149] = polygon_table[21] = p16; /* 2111 || 0111 */polygon_table[86] = polygon_table[84] = p17; /* 1112 || 1110 */polygon_table[89] = polygon_table[81] = p18; /* 1121 || 1101 */polygon_table[96] = polygon_table[74] = p19; /* 1200 || 1022 */polygon_table[24] = polygon_table[146] = p20; /* 0120 || 2102 */polygon_table[6] = polygon_table[164] = p21; /* 0012 || 2210 */polygon_table[129] = polygon_table[41] = p22; /* 2001 || 0221 */polygon_table[66] = polygon_table[104] = p23; /* 1002 || 1220 */polygon_table[144] = polygon_table[26] = p24; /* 2100 || 0122 */polygon_table[36] = polygon_table[134] = p25; /* 0210 || 2012 */polygon_table[9] = polygon_table[161] = p26; /* 0021 || 2201 *//* hexagon cases */polygon_table[37] = polygon_table[133] = p27; /* 0211 || 2011 */polygon_table[148] = polygon_table[22] = p28; /* 2110 || 0112 */polygon_table[82] = polygon_table[88] = p29; /* 1102 || 1120 */polygon_table[73] = polygon_table[97] = p30; /* 1021 || 1201 */polygon_table[145] = polygon_table[25] = p31; /* 2101 || 0121 */polygon_table[70] = polygon_table[100] = p32; /* 1012 || 1210 *//* 8-sided cases */polygon_table[34] = function (c) {  return [p07(c), p05(c)];}; /* 0202 || 2020 with flipped == 0 */polygon_table[35] = p33; /* flipped == 1 state for 0202 and 2020 */polygon_table[136] = function (c) {  return [p06(c), p04(c)];}; /* 2020 || 0202 with flipped == 0 *//* 6-sided cases */polygon_table[153] = function (c) {  return [p02(c), p00(c)];}; /* 0101 with flipped == 0 || 2121 with flipped == 2 */polygon_table[102] = function (c) {  return [p01(c), p03(c)];}; /* 1010 with flipped == 0 || 1212 with flipped == 2 */polygon_table[155] = p34; /* 0101 with flipped == 1 || 2121 with flipped == 1 */polygon_table[103] = p35; /* 1010 with flipped == 1 || 1212 with flipped == 1 *//* 7-sided cases */polygon_table[152] = function (c) {  return [p02(c), p04(c)];}; /* 2120 with flipped == 2 || 0102 with flipped == 0 */polygon_table[156] = p36; /* 2120 with flipped == 1 || 0102 with flipped == 1 */polygon_table[137] = function (c) {  return [p06(c), p00(c)];}; /* 2021 with flipped == 2 || 0201 with flipped == 0 */polygon_table[139] = p37; /* 2021 with flipped == 1 || 0201 with flipped == 1 */polygon_table[98] = function (c) {  return [p05(c), p03(c)];}; /* 1202 with flipped == 2 || 1020 with flipped == 0 */polygon_table[99] = p38; /* 1202 with flipped == 1 || 1020 with flipped == 1 */polygon_table[38] = function (c) {  return [p01(c), p07(c)];}; /* 0212 with flipped == 2 || 2010 with flipped == 0 */polygon_table[39] = p39; /* 0212 with flipped == 1 || 2010 with flipped == 1 *//*####################################Some small helper functions####################################*//* assume that x1 == 1 &&  x0 == 0 */function interpolateX(y, y0, y1) {  return (y - y0) / (y1 - y0);}function isArray(myArray) {  return myArray.constructor.toString().indexOf("Array") > -1;}/*####################################Below is the actual Marching Squares implementation####################################*/function computeBandGrid(data, minV, bandwidth) {  var rows = data.length - 1;  var cols = data[0].length - 1;  var BandGrid = { rows: rows, cols: cols, cells: [] };  var maxV = minV + Math.abs(bandwidth);  for (var j = 0; j < rows; ++j) {    BandGrid.cells[j] = [];    for (var i = 0; i < cols; ++i) {      /*  compose the 4-trit corner representation */      var cval = 0;      var tl = data[j + 1][i];      var tr = data[j + 1][i + 1];      var br = data[j][i + 1];      var bl = data[j][i];      if (isNaN(tl) || isNaN(tr) || isNaN(br) || isNaN(bl)) {        continue;      }      cval |= tl < minV ? 0 : tl > maxV ? 128 : 64;      cval |= tr < minV ? 0 : tr > maxV ? 32 : 16;      cval |= br < minV ? 0 : br > maxV ? 8 : 4;      cval |= bl < minV ? 0 : bl > maxV ? 2 : 1;      var cval_real = +cval;      /* resolve ambiguity via averaging */      var flipped = 0;      if (        cval === 17 /* 0101 */ ||        cval === 18 /* 0102 */ ||        cval === 33 /* 0201 */ ||        cval === 34 /* 0202 */ ||        cval === 38 /* 0212 */ ||        cval === 68 /* 1010 */ ||        cval === 72 /* 1020 */ ||        cval === 98 /* 1202 */ ||        cval === 102 /* 1212 */ ||        cval === 132 /* 2010 */ ||        cval === 136 /* 2020 */ ||        cval === 137 /* 2021 */ ||        cval === 152 /* 2120 */ ||        cval === 153 /* 2121 */      ) {        var average = (tl + tr + br + bl) / 4;        /* set flipped state */        flipped = average > maxV ? 2 : average < minV ? 0 : 1;        /* adjust cval for flipped cases */        /* 8-sided cases */        if (cval === 34) {          if (flipped === 1) {            cval = 35;          } else if (flipped === 0) {            cval = 136;          }        } else if (cval === 136) {          if (flipped === 1) {            cval = 35;            flipped = 4;          } else if (flipped === 0) {            cval = 34;          }        } else if (cval === 17) {          /* 6-sided polygon cases */          if (flipped === 1) {            cval = 155;            flipped = 4;          } else if (flipped === 0) {            cval = 153;          }        } else if (cval === 68) {          if (flipped === 1) {            cval = 103;            flipped = 4;          } else if (flipped === 0) {            cval = 102;          }        } else if (cval === 153) {          if (flipped === 1) cval = 155;        } else if (cval === 102) {          if (flipped === 1) cval = 103;        } else if (cval === 152) {          /* 7-sided polygon cases */          if (flipped < 2) {            cval = 156;            flipped = 1;          }        } else if (cval === 137) {          if (flipped < 2) {            cval = 139;            flipped = 1;          }        } else if (cval === 98) {          if (flipped < 2) {            cval = 99;            flipped = 1;          }        } else if (cval === 38) {          if (flipped < 2) {            cval = 39;            flipped = 1;          }        } else if (cval === 18) {          if (flipped > 0) {            cval = 156;            flipped = 4;          } else {            cval = 152;          }        } else if (cval === 33) {          if (flipped > 0) {            cval = 139;            flipped = 4;          } else {            cval = 137;          }        } else if (cval === 72) {          if (flipped > 0) {            cval = 99;            flipped = 4;          } else {            cval = 98;          }        } else if (cval === 132) {          if (flipped > 0) {            cval = 39;            flipped = 4;          } else {            cval = 38;          }        }      }      /* add cell to BandGrid if it contains at least one polygon-side */      if (cval != 0 && cval != 170) {        var topleft,          topright,          bottomleft,          bottomright,          righttop,          rightbottom,          lefttop,          leftbottom;        topleft = topright = bottomleft = bottomright = righttop = rightbottom = lefttop = leftbottom = 0.5;        var edges = [];        /* do interpolation here */        /* 1st Triangles */        if (cval === 1) {          /* 0001 */          bottomleft = 1 - interpolateX(minV, br, bl);          leftbottom = 1 - interpolateX(minV, tl, bl);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 169) {          /* 2221 */          bottomleft = interpolateX(maxV, bl, br);          leftbottom = interpolateX(maxV, bl, tl);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 4) {          /* 0010 */          rightbottom = 1 - interpolateX(minV, tr, br);          bottomright = interpolateX(minV, bl, br);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 166) {          /* 2212 */          rightbottom = interpolateX(maxV, br, tr);          bottomright = 1 - interpolateX(maxV, br, bl);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 16) {          /* 0100 */          righttop = interpolateX(minV, br, tr);          topright = interpolateX(minV, tl, tr);          edges.push(isoBandEdgeRT[cval]);        } else if (cval === 154) {          /* 2122 */          righttop = 1 - interpolateX(maxV, tr, br);          topright = 1 - interpolateX(maxV, tr, tl);          edges.push(isoBandEdgeRT[cval]);        } else if (cval === 64) {          /* 1000 */          lefttop = interpolateX(minV, bl, tl);          topleft = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 106) {          /* 1222 */          lefttop = 1 - interpolateX(maxV, tl, bl);          topleft = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 168) {          /* 2nd Trapezoids */          /* 2220 */          bottomright = interpolateX(maxV, bl, br);          bottomleft = interpolateX(minV, bl, br);          leftbottom = interpolateX(minV, bl, tl);          lefttop = interpolateX(maxV, bl, tl);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 2) {          /* 0002 */          bottomright = 1 - interpolateX(minV, br, bl);          bottomleft = 1 - interpolateX(maxV, br, bl);          leftbottom = 1 - interpolateX(maxV, tl, bl);          lefttop = 1 - interpolateX(minV, tl, bl);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 162) {          /* 2202 */          righttop = interpolateX(maxV, br, tr);          rightbottom = interpolateX(minV, br, tr);          bottomright = 1 - interpolateX(minV, br, bl);          bottomleft = 1 - interpolateX(maxV, br, bl);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 8) {          /* 0020 */          righttop = 1 - interpolateX(minV, tr, br);          rightbottom = 1 - interpolateX(maxV, tr, br);          bottomright = interpolateX(maxV, bl, br);          bottomleft = interpolateX(minV, bl, br);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 138) {          /* 2022 */          righttop = 1 - interpolateX(minV, tr, br);          rightbottom = 1 - interpolateX(maxV, tr, br);          topleft = 1 - interpolateX(maxV, tr, tl);          topright = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 32) {          /* 0200 */          righttop = interpolateX(maxV, br, tr);          rightbottom = interpolateX(minV, br, tr);          topleft = interpolateX(minV, tl, tr);          topright = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 42) {          /* 0222 */          leftbottom = 1 - interpolateX(maxV, tl, bl);          lefttop = 1 - interpolateX(minV, tl, bl);          topleft = interpolateX(minV, tl, tr);          topright = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeLB[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 128) {          /* 2000 */          leftbottom = interpolateX(minV, bl, tl);          lefttop = interpolateX(maxV, bl, tl);          topleft = 1 - interpolateX(maxV, tr, tl);          topright = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeLB[cval]);          edges.push(isoBandEdgeLT[cval]);        }        /* 3rd rectangle cases */        if (cval === 5) {          /* 0011 */          rightbottom = 1 - interpolateX(minV, tr, br);          leftbottom = 1 - interpolateX(minV, tl, bl);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 165) {          /* 2211 */          rightbottom = interpolateX(maxV, br, tr);          leftbottom = interpolateX(maxV, bl, tl);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 20) {          /* 0110 */          bottomright = interpolateX(minV, bl, br);          topright = interpolateX(minV, tl, tr);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 150) {          /* 2112 */          bottomright = 1 - interpolateX(maxV, br, bl);          topright = 1 - interpolateX(maxV, tr, tl);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 80) {          /* 1100 */          righttop = interpolateX(minV, br, tr);          lefttop = interpolateX(minV, bl, tl);          edges.push(isoBandEdgeRT[cval]);        } else if (cval === 90) {          /* 1122 */          righttop = 1 - interpolateX(maxV, tr, br);          lefttop = 1 - interpolateX(maxV, tl, bl);          edges.push(isoBandEdgeRT[cval]);        } else if (cval === 65) {          /* 1001 */          bottomleft = 1 - interpolateX(minV, br, bl);          topleft = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 105) {          /* 1221 */          bottomleft = interpolateX(maxV, bl, br);          topleft = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 160) {          /* 2200 */          righttop = interpolateX(maxV, br, tr);          rightbottom = interpolateX(minV, br, tr);          leftbottom = interpolateX(minV, bl, tl);          lefttop = interpolateX(maxV, bl, tl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 10) {          /* 0022 */          righttop = 1 - interpolateX(minV, tr, br);          rightbottom = 1 - interpolateX(maxV, tr, br);          leftbottom = 1 - interpolateX(maxV, tl, bl);          lefttop = 1 - interpolateX(minV, tl, bl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 130) {          /* 2002 */          bottomright = 1 - interpolateX(minV, br, bl);          bottomleft = 1 - interpolateX(maxV, br, bl);          topleft = 1 - interpolateX(maxV, tr, tl);          topright = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 40) {          /* 0220 */          bottomright = interpolateX(maxV, bl, br);          bottomleft = interpolateX(minV, bl, br);          topleft = interpolateX(minV, tl, tr);          topright = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 101) {          /* 4th single pentagon cases */          /* 1211 */          rightbottom = interpolateX(maxV, br, tr);          topleft = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 69) {          /* 1011 */          rightbottom = 1 - interpolateX(minV, tr, br);          topleft = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 149) {          /* 2111 */          leftbottom = interpolateX(maxV, bl, tl);          topright = 1 - interpolateX(maxV, tr, tl);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 21) {          /* 0111 */          leftbottom = 1 - interpolateX(minV, tl, bl);          topright = interpolateX(minV, tl, tr);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 86) {          /* 1112 */          bottomright = 1 - interpolateX(maxV, br, bl);          lefttop = 1 - interpolateX(maxV, tl, bl);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 84) {          /* 1110 */          bottomright = interpolateX(minV, bl, br);          lefttop = interpolateX(minV, bl, tl);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 89) {          /* 1121 */          righttop = 1 - interpolateX(maxV, tr, br);          bottomleft = interpolateX(maxV, bl, br);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 81) {          /* 1101 */          righttop = interpolateX(minV, br, tr);          bottomleft = 1 - interpolateX(minV, br, bl);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 96) {          /* 1200 */          righttop = interpolateX(maxV, br, tr);          rightbottom = interpolateX(minV, br, tr);          lefttop = interpolateX(minV, bl, tl);          topleft = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 74) {          /* 1022 */          righttop = 1 - interpolateX(minV, tr, br);          rightbottom = 1 - interpolateX(maxV, tr, br);          lefttop = 1 - interpolateX(maxV, tl, bl);          topleft = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 24) {          /* 0120 */          righttop = 1 - interpolateX(maxV, tr, br);          bottomright = interpolateX(maxV, bl, br);          bottomleft = interpolateX(minV, bl, br);          topright = interpolateX(minV, tl, tr);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 146) {          /* 2102 */          righttop = interpolateX(minV, br, tr);          bottomright = 1 - interpolateX(minV, br, bl);          bottomleft = 1 - interpolateX(maxV, br, bl);          topright = 1 - interpolateX(maxV, tr, tl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 6) {          /* 0012 */          rightbottom = 1 - interpolateX(minV, tr, br);          bottomright = 1 - interpolateX(maxV, br, bl);          leftbottom = 1 - interpolateX(maxV, tl, bl);          lefttop = 1 - interpolateX(minV, tl, bl);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 164) {          /* 2210 */          rightbottom = interpolateX(maxV, br, tr);          bottomright = interpolateX(minV, bl, br);          leftbottom = interpolateX(minV, bl, tl);          lefttop = interpolateX(maxV, bl, tl);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 129) {          /* 2001 */          bottomleft = 1 - interpolateX(minV, br, bl);          leftbottom = interpolateX(maxV, bl, tl);          topleft = 1 - interpolateX(maxV, tr, tl);          topright = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeBL[cval]);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 41) {          /* 0221 */          bottomleft = interpolateX(maxV, bl, br);          leftbottom = 1 - interpolateX(minV, tl, bl);          topleft = interpolateX(minV, tl, tr);          topright = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeBL[cval]);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 66) {          /* 1002 */          bottomright = 1 - interpolateX(minV, br, bl);          bottomleft = 1 - interpolateX(maxV, br, bl);          lefttop = 1 - interpolateX(maxV, tl, bl);          topleft = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 104) {          /* 1220 */          bottomright = interpolateX(maxV, bl, br);          bottomleft = interpolateX(minV, bl, br);          lefttop = interpolateX(minV, bl, tl);          topleft = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeBL[cval]);          edges.push(isoBandEdgeTL[cval]);        } else if (cval === 144) {          /* 2100 */          righttop = interpolateX(minV, br, tr);          leftbottom = interpolateX(minV, bl, tl);          lefttop = interpolateX(maxV, bl, tl);          topright = 1 - interpolateX(maxV, tr, tl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 26) {          /* 0122 */          righttop = 1 - interpolateX(maxV, tr, br);          leftbottom = 1 - interpolateX(maxV, tl, bl);          lefttop = 1 - interpolateX(minV, tl, bl);          topright = interpolateX(minV, tl, tr);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 36) {          /* 0210 */          rightbottom = interpolateX(maxV, br, tr);          bottomright = interpolateX(minV, bl, br);          topleft = interpolateX(minV, tl, tr);          topright = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 134) {          /* 2012 */          rightbottom = 1 - interpolateX(minV, tr, br);          bottomright = 1 - interpolateX(maxV, br, bl);          topleft = 1 - interpolateX(maxV, tr, tl);          topright = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 9) {          /* 0021 */          righttop = 1 - interpolateX(minV, tr, br);          rightbottom = 1 - interpolateX(maxV, tr, br);          bottomleft = interpolateX(maxV, bl, br);          leftbottom = 1 - interpolateX(minV, tl, bl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 161) {          /* 2201 */          righttop = interpolateX(maxV, br, tr);          rightbottom = interpolateX(minV, br, tr);          bottomleft = 1 - interpolateX(minV, br, bl);          leftbottom = interpolateX(maxV, bl, tl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 37) {          /* 5th single hexagon cases */          /* 0211 */          rightbottom = interpolateX(maxV, br, tr);          leftbottom = 1 - interpolateX(minV, tl, bl);          topleft = interpolateX(minV, tl, tr);          topright = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 133) {          /* 2011 */          rightbottom = 1 - interpolateX(minV, tr, br);          leftbottom = interpolateX(maxV, bl, tl);          topleft = 1 - interpolateX(maxV, tr, tl);          topright = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 148) {          /* 2110 */          bottomright = interpolateX(minV, bl, br);          leftbottom = interpolateX(minV, bl, tl);          lefttop = interpolateX(maxV, bl, tl);          topright = 1 - interpolateX(maxV, tr, tl);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 22) {          /* 0112 */          bottomright = 1 - interpolateX(maxV, br, bl);          leftbottom = 1 - interpolateX(maxV, tl, bl);          lefttop = 1 - interpolateX(minV, tl, bl);          topright = interpolateX(minV, tl, tr);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 82) {          /* 1102 */          righttop = interpolateX(minV, br, tr);          bottomright = 1 - interpolateX(minV, br, bl);          bottomleft = 1 - interpolateX(maxV, br, bl);          lefttop = 1 - interpolateX(maxV, tl, bl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 88) {          /* 1120 */          righttop = 1 - interpolateX(maxV, tr, br);          bottomright = interpolateX(maxV, bl, br);          bottomleft = interpolateX(minV, bl, br);          lefttop = interpolateX(minV, bl, tl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 73) {          /* 1021 */          righttop = 1 - interpolateX(minV, tr, br);          rightbottom = 1 - interpolateX(maxV, tr, br);          bottomleft = interpolateX(maxV, bl, br);          topleft = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 97) {          /* 1201 */          righttop = interpolateX(maxV, br, tr);          rightbottom = interpolateX(minV, br, tr);          bottomleft = 1 - interpolateX(minV, br, bl);          topleft = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);        } else if (cval === 145) {          /* 2101 */          righttop = interpolateX(minV, br, tr);          bottomleft = 1 - interpolateX(minV, br, bl);          leftbottom = interpolateX(maxV, bl, tl);          topright = 1 - interpolateX(maxV, tr, tl);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 25) {          /* 0121 */          righttop = 1 - interpolateX(maxV, tr, br);          bottomleft = interpolateX(maxV, bl, br);          leftbottom = 1 - interpolateX(minV, tl, bl);          topright = interpolateX(minV, tl, tr);          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 70) {          /* 1012 */          rightbottom = 1 - interpolateX(minV, tr, br);          bottomright = 1 - interpolateX(maxV, br, bl);          lefttop = 1 - interpolateX(maxV, tl, bl);          topleft = 1 - interpolateX(minV, tr, tl);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 100) {          /* 1210 */          rightbottom = interpolateX(maxV, br, tr);          bottomright = interpolateX(minV, bl, br);          lefttop = interpolateX(minV, bl, tl);          topleft = interpolateX(maxV, tl, tr);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 34) {          /* 8-sided cases */          /* 0202 || 2020 with flipped == 0 */          if (flipped === 0) {            righttop = 1 - interpolateX(minV, tr, br);            rightbottom = 1 - interpolateX(maxV, tr, br);            bottomright = interpolateX(maxV, bl, br);            bottomleft = interpolateX(minV, bl, br);            leftbottom = interpolateX(minV, bl, tl);            lefttop = interpolateX(maxV, bl, tl);            topleft = 1 - interpolateX(maxV, tr, tl);            topright = 1 - interpolateX(minV, tr, tl);          } else {            righttop = interpolateX(maxV, br, tr);            rightbottom = interpolateX(minV, br, tr);            bottomright = 1 - interpolateX(minV, br, bl);            bottomleft = 1 - interpolateX(maxV, br, bl);            leftbottom = 1 - interpolateX(maxV, tl, bl);            lefttop = 1 - interpolateX(minV, tl, bl);            topleft = interpolateX(minV, tl, tr);            topright = interpolateX(maxV, tl, tr);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeLB[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 35) {          /* flipped == 1 state for 0202, and 2020 with flipped == 4*/          if (flipped === 4) {            righttop = 1 - interpolateX(minV, tr, br);            rightbottom = 1 - interpolateX(maxV, tr, br);            bottomright = interpolateX(maxV, bl, br);            bottomleft = interpolateX(minV, bl, br);            leftbottom = interpolateX(minV, bl, tl);            lefttop = interpolateX(maxV, bl, tl);            topleft = 1 - interpolateX(maxV, tr, tl);            topright = 1 - interpolateX(minV, tr, tl);          } else {            righttop = interpolateX(maxV, br, tr);            rightbottom = interpolateX(minV, br, tr);            bottomright = 1 - interpolateX(minV, br, bl);            bottomleft = 1 - interpolateX(maxV, br, bl);            leftbottom = 1 - interpolateX(maxV, tl, bl);            lefttop = 1 - interpolateX(minV, tl, bl);            topleft = interpolateX(minV, tl, tr);            topright = interpolateX(maxV, tl, tr);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBL[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 136) {          /* 2020 || 0202 with flipped == 0 */          if (flipped === 0) {            righttop = interpolateX(maxV, br, tr);            rightbottom = interpolateX(minV, br, tr);            bottomright = 1 - interpolateX(minV, br, bl);            bottomleft = 1 - interpolateX(maxV, br, bl);            leftbottom = 1 - interpolateX(maxV, tl, bl);            lefttop = 1 - interpolateX(minV, tl, bl);            topleft = interpolateX(minV, tl, tr);            topright = interpolateX(maxV, tl, tr);          } else {            righttop = 1 - interpolateX(minV, tr, br);            rightbottom = 1 - interpolateX(maxV, tr, br);            bottomright = interpolateX(maxV, bl, br);            bottomleft = interpolateX(minV, bl, br);            leftbottom = interpolateX(minV, bl, tl);            lefttop = interpolateX(maxV, bl, tl);            topleft = 1 - interpolateX(maxV, tr, tl);            topright = 1 - interpolateX(minV, tr, tl);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeLB[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 153) {          /* 6-sided polygon cases */          /* 0101 with flipped == 0 || 2121 with flipped == 2 */          if (flipped === 0) {            righttop = interpolateX(minV, br, tr);            bottomleft = 1 - interpolateX(minV, br, bl);            leftbottom = 1 - interpolateX(minV, tl, bl);            topright = interpolateX(minV, tl, tr);          } else {            righttop = 1 - interpolateX(maxV, tr, br);            bottomleft = interpolateX(maxV, bl, br);            leftbottom = interpolateX(maxV, bl, tl);            topright = 1 - interpolateX(maxV, tr, tl);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 102) {          /* 1010 with flipped == 0 || 1212 with flipped == 2 */          if (flipped === 0) {            rightbottom = 1 - interpolateX(minV, tr, br);            bottomright = interpolateX(minV, bl, br);            lefttop = interpolateX(minV, bl, tl);            topleft = 1 - interpolateX(minV, tr, tl);          } else {            rightbottom = interpolateX(maxV, br, tr);            bottomright = 1 - interpolateX(maxV, br, bl);            lefttop = 1 - interpolateX(maxV, tl, bl);            topleft = interpolateX(maxV, tl, tr);          }          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 155) {          /* 0101 with flipped == 4 || 2121 with flipped == 1 */          if (flipped === 4) {            righttop = interpolateX(minV, br, tr);            bottomleft = 1 - interpolateX(minV, br, bl);            leftbottom = 1 - interpolateX(minV, tl, bl);            topright = interpolateX(minV, tl, tr);          } else {            righttop = 1 - interpolateX(maxV, tr, br);            bottomleft = interpolateX(maxV, bl, br);            leftbottom = interpolateX(maxV, bl, tl);            topright = 1 - interpolateX(maxV, tr, tl);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 103) {          /* 1010 with flipped == 4 || 1212 with flipped == 1 */          if (flipped === 4) {            rightbottom = 1 - interpolateX(minV, tr, br);            bottomright = interpolateX(minV, bl, br);            lefttop = interpolateX(minV, bl, tl);            topleft = 1 - interpolateX(minV, tr, tl);          } else {            rightbottom = interpolateX(maxV, br, tr);            bottomright = 1 - interpolateX(maxV, br, bl);            lefttop = 1 - interpolateX(maxV, tl, bl);            topleft = interpolateX(maxV, tl, tr);          }          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBR[cval]);        } else if (cval === 152) {          /* 7-sided polygon cases */          /* 2120 with flipped == 2 || 0102 with flipped == 0 */          if (flipped === 0) {            righttop = interpolateX(minV, br, tr);            bottomright = 1 - interpolateX(minV, br, bl);            bottomleft = 1 - interpolateX(maxV, br, bl);            leftbottom = 1 - interpolateX(maxV, tl, bl);            lefttop = 1 - interpolateX(minV, tl, bl);            topright = interpolateX(minV, tl, tr);          } else {            righttop = 1 - interpolateX(maxV, tr, br);            bottomright = interpolateX(maxV, bl, br);            bottomleft = interpolateX(minV, bl, br);            leftbottom = interpolateX(minV, bl, tl);            lefttop = interpolateX(maxV, bl, tl);            topright = 1 - interpolateX(maxV, tr, tl);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 156) {          /* 2120 with flipped == 1 || 0102 with flipped == 4 */          if (flipped === 4) {            righttop = interpolateX(minV, br, tr);            bottomright = 1 - interpolateX(minV, br, bl);            bottomleft = 1 - interpolateX(maxV, br, bl);            leftbottom = 1 - interpolateX(maxV, tl, bl);            lefttop = 1 - interpolateX(minV, tl, bl);            topright = interpolateX(minV, tl, tr);          } else {            righttop = 1 - interpolateX(maxV, tr, br);            bottomright = interpolateX(maxV, bl, br);            bottomleft = interpolateX(minV, bl, br);            leftbottom = interpolateX(minV, bl, tl);            lefttop = interpolateX(maxV, bl, tl);            topright = 1 - interpolateX(maxV, tr, tl);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeBL[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 137) {          /* 2021 with flipped == 2 || 0201 with flipped == 0 */          if (flipped === 0) {            righttop = interpolateX(maxV, br, tr);            rightbottom = interpolateX(minV, br, tr);            bottomleft = 1 - interpolateX(minV, br, bl);            leftbottom = 1 - interpolateX(minV, tl, bl);            topleft = interpolateX(minV, tl, tr);            topright = interpolateX(maxV, tl, tr);          } else {            righttop = 1 - interpolateX(minV, tr, br);            rightbottom = 1 - interpolateX(maxV, tr, br);            bottomleft = interpolateX(maxV, bl, br);            leftbottom = interpolateX(maxV, bl, tl);            topleft = 1 - interpolateX(maxV, tr, tl);            topright = 1 - interpolateX(minV, tr, tl);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 139) {          /* 2021 with flipped == 1 || 0201 with flipped == 4 */          if (flipped === 4) {            righttop = interpolateX(maxV, br, tr);            rightbottom = interpolateX(minV, br, tr);            bottomleft = 1 - interpolateX(minV, br, bl);            leftbottom = 1 - interpolateX(minV, tl, bl);            topleft = interpolateX(minV, tl, tr);            topright = interpolateX(maxV, tl, tr);          } else {            righttop = 1 - interpolateX(minV, tr, br);            rightbottom = 1 - interpolateX(maxV, tr, br);            bottomleft = interpolateX(maxV, bl, br);            leftbottom = interpolateX(maxV, bl, tl);            topleft = 1 - interpolateX(maxV, tr, tl);            topright = 1 - interpolateX(minV, tr, tl);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeLB[cval]);        } else if (cval === 98) {          /* 1202 with flipped == 2 || 1020 with flipped == 0 */          if (flipped === 0) {            righttop = 1 - interpolateX(minV, tr, br);            rightbottom = 1 - interpolateX(maxV, tr, br);            bottomright = interpolateX(maxV, bl, br);            bottomleft = interpolateX(minV, bl, br);            lefttop = interpolateX(minV, bl, tl);            topleft = 1 - interpolateX(minV, tr, tl);          } else {            righttop = interpolateX(maxV, br, tr);            rightbottom = interpolateX(minV, br, tr);            bottomright = 1 - interpolateX(minV, br, bl);            bottomleft = 1 - interpolateX(maxV, br, bl);            lefttop = 1 - interpolateX(maxV, tl, bl);            topleft = interpolateX(maxV, tl, tr);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 99) {          /* 1202 with flipped == 1 || 1020 with flipped == 4 */          if (flipped === 4) {            righttop = 1 - interpolateX(minV, tr, br);            rightbottom = 1 - interpolateX(maxV, tr, br);            bottomright = interpolateX(maxV, bl, br);            bottomleft = interpolateX(minV, bl, br);            lefttop = interpolateX(minV, bl, tl);            topleft = 1 - interpolateX(minV, tr, tl);          } else {            righttop = interpolateX(maxV, br, tr);            rightbottom = interpolateX(minV, br, tr);            bottomright = 1 - interpolateX(minV, br, bl);            bottomleft = 1 - interpolateX(maxV, br, bl);            lefttop = 1 - interpolateX(maxV, tl, bl);            topleft = interpolateX(maxV, tl, tr);          }          edges.push(isoBandEdgeRT[cval]);          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBL[cval]);        } else if (cval === 38) {          /* 0212 with flipped == 2 || 2010 with flipped == 0 */          if (flipped === 0) {            rightbottom = 1 - interpolateX(minV, tr, br);            bottomright = interpolateX(minV, bl, br);            leftbottom = interpolateX(minV, bl, tl);            lefttop = interpolateX(maxV, bl, tl);            topleft = 1 - interpolateX(maxV, tr, tl);            topright = 1 - interpolateX(minV, tr, tl);          } else {            rightbottom = interpolateX(maxV, br, tr);            bottomright = 1 - interpolateX(maxV, br, bl);            leftbottom = 1 - interpolateX(maxV, tl, bl);            lefttop = 1 - interpolateX(minV, tl, bl);            topleft = interpolateX(minV, tl, tr);            topright = interpolateX(maxV, tl, tr);          }          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeLB[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 39) {          /* 0212 with flipped == 1 || 2010 with flipped == 4 */          if (flipped === 4) {            rightbottom = 1 - interpolateX(minV, tr, br);            bottomright = interpolateX(minV, bl, br);            leftbottom = interpolateX(minV, bl, tl);            lefttop = interpolateX(maxV, bl, tl);            topleft = 1 - interpolateX(maxV, tr, tl);            topright = 1 - interpolateX(minV, tr, tl);          } else {            rightbottom = interpolateX(maxV, br, tr);            bottomright = 1 - interpolateX(maxV, br, bl);            leftbottom = 1 - interpolateX(maxV, tl, bl);            lefttop = 1 - interpolateX(minV, tl, bl);            topleft = interpolateX(minV, tl, tr);            topright = interpolateX(maxV, tl, tr);          }          edges.push(isoBandEdgeRB[cval]);          edges.push(isoBandEdgeBR[cval]);          edges.push(isoBandEdgeLT[cval]);        } else if (cval === 85) {          righttop = 1;          rightbottom = 0;          bottomright = 1;          bottomleft = 0;          leftbottom = 0;          lefttop = 1;          topleft = 0;          topright = 1;        }        if (          topleft < 0 ||          topleft > 1 ||          topright < 0 ||          topright > 1 ||          righttop < 0 ||          righttop > 1 ||          bottomright < 0 ||          bottomright > 1 ||          leftbottom < 0 ||          leftbottom > 1 ||          lefttop < 0 ||          lefttop > 1        ) {          console.log(            "MarchingSquaresJS-isoBands: " +              cval +              " " +              cval_real +              " " +              tl +              "," +              tr +              "," +              br +              "," +              bl +              " " +              flipped +              " " +              topleft +              " " +              topright +              " " +              righttop +              " " +              rightbottom +              " " +              bottomright +              " " +              bottomleft +              " " +              leftbottom +              " " +              lefttop          );        }        BandGrid.cells[j][i] = {          cval: cval,          cval_real: cval_real,          flipped: flipped,          topleft: topleft,          topright: topright,          righttop: righttop,          rightbottom: rightbottom,          bottomright: bottomright,          bottomleft: bottomleft,          leftbottom: leftbottom,          lefttop: lefttop,          edges: edges,        };      }    }  }  return BandGrid;}function BandGrid2AreaPaths(grid) {  var areas = [];  var rows = grid.rows;  var cols = grid.cols;  var currentPolygon = [];  for (var j = 0; j < rows; j++) {    for (var i = 0; i < cols; i++) {      if (        typeof grid.cells[j][i] !== "undefined" &&        grid.cells[j][i].edges.length > 0      ) {        /* trace back polygon path starting from this cell */        var cell = grid.cells[j][i];        /* get start coordinates */        var prev = getStartXY(cell),          next = null,          p = i,          q = j;        if (prev !== null) {          currentPolygon.push([prev.p[0] + p, prev.p[1] + q]);          //console.log(cell);          //console.log("coords: " + (prev.p[0] + p) + " " + (prev.p[1] + q));        }        do {          //console.log(p + "," + q);          //console.log(grid.cells[q][p]);          //console.log(grid.cells[q][p].edges);          //console.log("from : " + prev.x + " " + prev.y + " " + prev.o);          next = getExitXY(grid.cells[q][p], prev.x, prev.y, prev.o);          if (next !== null) {            //console.log("coords: " + (next.p[0] + p) + " " + (next.p[1] + q));            currentPolygon.push([next.p[0] + p, next.p[1] + q]);            p += next.x;            q += next.y;            prev = next;          } else {            //console.log("getExitXY() returned null!");            break;          }          //console.log("to : " + next.x + " " + next.y + " " + next.o);          /* special case, where we've reached the grid boundaries */          if (            q < 0 ||            q >= rows ||            p < 0 ||            p >= cols ||            typeof grid.cells[q][p] === "undefined"          ) {            /* to create a closed path, we need to trace our way                arround the missing data, until we find an entry                point again            */            /* set back coordinates of current cell */            p -= next.x;            q -= next.y;            //console.log("reached boundary at " + p + " " + q);            var missing = traceOutOfGridPath(              grid,              p,              q,              next.x,              next.y,              next.o            );            if (missing !== null) {              missing.path.forEach(function (pp) {                //console.log("coords: " + (pp[0]) + " " + (pp[1]));                currentPolygon.push(pp);              });              p = missing.i;              q = missing.j;              prev = missing;            } else {              break;            }            //console.log(grid.cells[q][p]);          }        } while (          typeof grid.cells[q][p] !== "undefined" &&          grid.cells[q][p].edges.length > 0        );        areas.push(currentPolygon);        //console.log("next polygon");        //console.log(currentPolygon);        currentPolygon = [];        if (grid.cells[j][i].edges.length > 0) i--;      }    }  }  return areas;}function traceOutOfGridPath(grid, i, j, d_x, d_y, d_o) {  var cell = grid.cells[j][i];  var cval = cell.cval_real;  var p = i + d_x,    q = j + d_y;  var path = [];  var closed = false;  while (!closed) {    //console.log("processing cell " + p + "," + q + " " + d_x + " " + d_y + " " + d_o);    if (      typeof grid.cells[q] === "undefined" ||      typeof grid.cells[q][p] === "undefined"    ) {      //console.log("which is undefined");      /* we can't move on, so we have to change direction to proceed further */      /* go back to previous cell */      q -= d_y;      p -= d_x;      cell = grid.cells[q][p];      cval = cell.cval_real;      /* check where we've left defined cells of the grid... */      if (d_y === -1) {        /* we came from top */        if (d_o === 0) {          /* exit left */          if (cval & Node3) {            /* lower left node is within range, so we move left */            path.push([p, q]);            d_x = -1;            d_y = 0;            d_o = 0;          } else if (cval & Node2) {            /* lower right node is within range, so we move right */            path.push([p + 1, q]);            d_x = 1;            d_y = 0;            d_o = 0;          } else {            /* close the path */            path.push([p + cell.bottomright, q]);            d_x = 0;            d_y = 1;            d_o = 1;            closed = true;            break;          }        } else if (cval & Node3) {          path.push([p, q]);          d_x = -1;          d_y = 0;          d_o = 0;        } else if (cval & Node2) {          path.push([p + cell.bottomright, q]);          d_x = 0;          d_y = 1;          d_o = 1;          closed = true;          break;        } else {          path.push([p + cell.bottomleft, q]);          d_x = 0;          d_y = 1;          d_o = 0;          closed = true;          break;        }      } else if (d_y === 1) {        /* we came from bottom */        //console.log("we came from bottom and hit a non-existing cell " + (p + d_x) + "," + (q + d_y) + "!");        if (d_o === 0) {          /* exit left */          if (cval & Node1) {            /* top right node is within range, so we move right */            path.push([p + 1, q + 1]);            d_x = 1;            d_y = 0;            d_o = 1;          } else if (!(cval & Node0)) {            /* found entry within same cell */            path.push([p + cell.topright, q + 1]);            d_x = 0;            d_y = -1;            d_o = 1;            closed = true;            //console.log("found entry from bottom at " + p + "," + q);            break;          } else {            path.push([p + cell.topleft, q + 1]);            d_x = 0;            d_y = -1;            d_o = 0;            closed = true;            break;          }        } else if (cval & Node1) {          path.push([p + 1, q + 1]);          d_x = 1;          d_y = 0;          d_o = 1;        } else {          /* move right */          path.push([p + 1, q + 1]);          d_x = 1;          d_y = 0;          d_o = 1;          //console.log("wtf");          //break;        }      } else if (d_x === -1) {        /* we came from right */        //console.log("we came from right and hit a non-existing cell at " + (p + d_x) + "," + (q + d_y) + "!");        if (d_o === 0) {          //console.log("continue at bottom");          if (cval & Node0) {            path.push([p, q + 1]);            d_x = 0;            d_y = 1;            d_o = 0;            //console.log("moving upwards to " + (p + d_x) + "," + (q + d_y) + "!");          } else if (!(cval & Node3)) {            /* there has to be an entry into the regular grid again! */            //console.log("exiting top");            path.push([p, q + cell.lefttop]);            d_x = 1;            d_y = 0;            d_o = 1;            closed = true;            break;          } else {            //console.log("exiting bottom");            path.push([p, q + cell.leftbottom]);            d_x = 1;            d_y = 0;            d_o = 0;            closed = true;            break;          }        } else {          //console.log("continue at top");          if (cval & Node0) {            path.push([p, q + 1]);            d_x = 0;            d_y = 1;            d_o = 0;            //console.log("moving upwards to " + (p + d_x) + "," + (q + d_y) + "!");          } else {            /* */            console.log("MarchingSquaresJS-isoBands: wtf");            break;          }        }      } else if (d_x === 1) {        /* we came from left */        //console.log("we came from left and hit a non-existing cell " + (p + d_x) + "," + (q + d_y) + "!");        if (d_o === 0) {          /* exit bottom */          if (cval & Node2) {            path.push([p + 1, q]);            d_x = 0;            d_y = -1;            d_o = 1;          } else {            path.push([p + 1, q + cell.rightbottom]);            d_x = -1;            d_y = 0;            d_o = 0;            closed = true;            break;          }        } else {          /* exit top */          if (cval & Node2) {            path.push([p + 1, q]);            d_x = 0;            d_y = -1;            d_o = 1;          } else if (!(cval & Node1)) {            path.push([p + 1, q + cell.rightbottom]);            d_x = -1;            d_y = 0;            d_o = 0;            closed = true;            break;          } else {            path.push([p + 1, q + cell.righttop]);            d_x = -1;            d_y = 0;            d_o = 1;            break;          }        }      } else {        /* we came from the same cell */        console.log("MarchingSquaresJS-isoBands: we came from nowhere!");        break;      }    } else {      /* try to find an entry into the regular grid again! */      cell = grid.cells[q][p];      cval = cell.cval_real;      //console.log("which is defined");      if (d_x === -1) {        if (d_o === 0) {          /* try to go downwards */          if (            typeof grid.cells[q - 1] !== "undefined" &&            typeof grid.cells[q - 1][p] !== "undefined"          ) {            d_x = 0;            d_y = -1;            d_o = 1;          } else if (cval & Node3) {            /* proceed searching in x-direction */            //console.log("proceeding in x-direction!");            path.push([p, q]);          } else {            /* we must have found an entry into the regular grid */            path.push([p + cell.bottomright, q]);            d_x = 0;            d_y = 1;            d_o = 1;            closed = true;            //console.log("found entry from bottom at " + p + "," + q);            break;          }        } else if (cval & Node0) {          /* proceed searchin in x-direction */          console.log("MarchingSquaresJS-isoBands: proceeding in x-direction!");        } else {          /* we must have found an entry into the regular grid */          console.log(            "MarchingSquaresJS-isoBands: found entry from top at " + p + "," + q          );          break;        }      } else if (d_x === 1) {        if (d_o === 0) {          console.log("MarchingSquaresJS-isoBands: wtf");          break;        } else {          /* try to go upwards */          if (            typeof grid.cells[q + 1] !== "undefined" &&            typeof grid.cells[q + 1][p] !== "undefined"          ) {            d_x = 0;            d_y = 1;            d_o = 0;          } else if (cval & Node1) {            path.push([p + 1, q + 1]);            d_x = 1;            d_y = 0;            d_o = 1;          } else {            /* found an entry point into regular grid! */            path.push([p + cell.topleft, q + 1]);            d_x = 0;            d_y = -1;            d_o = 0;            closed = true;            //console.log("found entry from bottom at " + p + "," + q);            break;          }        }      } else if (d_y === -1) {        if (d_o === 1) {          /* try to go right */          if (typeof grid.cells[q][p + 1] !== "undefined") {            d_x = 1;            d_y = 0;            d_o = 1;          } else if (cval & Node2) {            path.push([p + 1, q]);            d_x = 0;            d_y = -1;            d_o = 1;          } else {            /* found entry into regular grid! */            path.push([p + 1, q + cell.righttop]);            d_x = -1;            d_y = 0;            d_o = 1;            closed = true;            //console.log("found entry from top at " + p + "," + q);            break;          }        } else {          console.log("MarchingSquaresJS-isoBands: wtf");          break;        }      } else if (d_y === 1) {        if (d_o === 0) {          //console.log("we came from bottom left and proceed to the left");          /* try to go left */          if (typeof grid.cells[q][p - 1] !== "undefined") {            d_x = -1;            d_y = 0;            d_o = 0;          } else if (cval & Node0) {            path.push([p, q + 1]);            d_x = 0;            d_y = 1;            d_o = 0;          } else {            /* found an entry point into regular grid! */            path.push([p, q + cell.leftbottom]);            d_x = 1;            d_y = 0;            d_o = 0;            closed = true;            //console.log("found entry from bottom at " + p + "," + q);            break;          }        } else {          //console.log("we came from bottom right and proceed to the right");          console.log("MarchingSquaresJS-isoBands: wtf");          break;        }      } else {        console.log("MarchingSquaresJS-isoBands: where did we came from???");        break;      }    }    p += d_x;    q += d_y;    //console.log("going on to  " + p + "," + q + " via " + d_x + " " + d_y + " " + d_o);    if (p === i && q === j) {      /* bail out, once we've closed a circle path */      break;    }  }  //console.log("exit with " + p + "," + q + " " + d_x + " " + d_y + " " + d_o);  return { path: path, i: p, j: q, x: d_x, y: d_y, o: d_o };}function deleteEdge(cell, edgeIdx) {  delete cell.edges[edgeIdx];  for (var k = edgeIdx + 1; k < cell.edges.length; k++) {    cell.edges[k - 1] = cell.edges[k];  }  cell.edges.pop();}function getStartXY(cell) {  if (cell.edges.length > 0) {    var e = cell.edges[cell.edges.length - 1];    //console.log("starting with edge " + e);    var cval = cell.cval_real;    switch (e) {      case 0:        if (cval & Node1) {          /* node 1 within range */          return { p: [1, cell.righttop], x: -1, y: 0, o: 1 };        } else {          /* node 1 below or above threshold */          return { p: [cell.topleft, 1], x: 0, y: -1, o: 0 };        }      case 1:        if (cval & Node2) {          return { p: [cell.topleft, 1], x: 0, y: -1, o: 0 };        } else {          return { p: [1, cell.rightbottom], x: -1, y: 0, o: 0 };        }      case 2:        if (cval & Node2) {          return { p: [cell.bottomright, 0], x: 0, y: 1, o: 1 };        } else {          return { p: [cell.topleft, 1], x: 0, y: -1, o: 0 };        }      case 3:        if (cval & Node3) {          return { p: [cell.topleft, 1], x: 0, y: -1, o: 0 };        } else {          return { p: [cell.bottomleft, 0], x: 0, y: 1, o: 0 };        }      case 4:        if (cval & Node1) {          return { p: [1, cell.righttop], x: -1, y: 0, o: 1 };        } else {          return { p: [cell.topright, 1], x: 0, y: -1, o: 1 };        }      case 5:        if (cval & Node2) {          return { p: [cell.topright, 1], x: 0, y: -1, o: 1 };        } else {          return { p: [1, cell.rightbottom], x: -1, y: 0, o: 0 };        }      case 6:        if (cval & Node2) {          return { p: [cell.bottomright, 0], x: 0, y: 1, o: 1 };        } else {          return { p: [cell.topright, 1], x: 0, y: -1, o: 1 };        }      case 7:        if (cval & Node3) {          return { p: [cell.topright, 1], x: 0, y: -1, o: 1 };        } else {          return { p: [cell.bottomleft, 0], x: 0, y: 1, o: 0 };        }      case 8:        if (cval & Node2) {          return { p: [cell.bottomright, 0], x: 0, y: 1, o: 1 };        } else {          return { p: [1, cell.righttop], x: -1, y: 0, o: 1 };        }      case 9:        if (cval & Node3) {          return { p: [1, cell.righttop], x: -1, y: 0, o: 1 };        } else {          return { p: [cell.bottomleft, 0], x: 0, y: 1, o: 0 };        }      case 10:        if (cval & Node3) {          return { p: [0, cell.leftbottom], x: 1, y: 0, o: 0 };        } else {          return { p: [1, cell.righttop], x: -1, y: 0, o: 1 };        }      case 11:        if (cval & Node0) {          return { p: [1, cell.righttop], x: -1, y: 0, o: 1 };        } else {          return { p: [0, cell.lefttop], x: 1, y: 0, o: 1 };        }      case 12:        if (cval & Node2) {          return { p: [cell.bottomright, 0], x: 0, y: 1, o: 1 };        } else {          return { p: [1, cell.rightbottom], x: -1, y: 0, o: 0 };        }      case 13:        if (cval & Node3) {          return { p: [1, cell.rightbottom], x: -1, y: 0, o: 0 };        } else {          return { p: [cell.bottomleft, 0], x: 0, y: 1, o: 0 };        }      case 14:        if (cval & Node3) {          return { p: [0, cell.leftbottom], x: 1, y: 0, o: 0 };        } else {          return { p: [1, cell.rightbottom], x: -1, y: 0, o: 0 };        }      case 15:        if (cval & Node0) {          return { p: [1, cell.rightbottom], x: -1, y: 0, o: 0 };        } else {          return { p: [0, cell.lefttop], x: 1, y: 0, o: 1 };        }      case 16:        if (cval & Node2) {          return { p: [cell.bottomright, 0], x: 0, y: 1, o: 1 };        } else {          return { p: [0, cell.leftbottom], x: 1, y: 0, o: 0 };        }      case 17:        if (cval & Node0) {          return { p: [cell.bottomright, 0], x: 0, y: 1, o: 1 };        } else {          return { p: [0, cell.lefttop], x: 1, y: 0, o: 1 };        }      case 18:        if (cval & Node3) {          return { p: [0, cell.leftbottom], x: 1, y: 0, o: 0 };        } else {          return { p: [cell.bottomleft, 0], x: 0, y: 1, o: 0 };        }      case 19:        if (cval & Node0) {          return { p: [cell.bottomleft, 0], x: 0, y: 1, o: 0 };        } else {          return { p: [0, cell.lefttop], x: 1, y: 0, o: 1 };        }      case 20:        if (cval & Node0) {          return { p: [cell.topleft, 1], x: 0, y: -1, o: 0 };        } else {          return { p: [0, cell.leftbottom], x: 1, y: 0, o: 0 };        }      case 21:        if (cval & Node1) {          return { p: [0, cell.leftbottom], x: 1, y: 0, o: 0 };        } else {          return { p: [cell.topright, 1], x: 0, y: -1, o: 1 };        }      case 22:        if (cval & Node0) {          return { p: [cell.topleft, 1], x: 0, y: -1, o: 0 };        } else {          return { p: [0, cell.lefttop], x: 1, y: 0, o: 1 };        }      case 23:        if (cval & Node1) {          return { p: [0, cell.lefttop], x: 1, y: 0, o: 1 };        } else {          return { p: [cell.topright, 1], x: 0, y: -1, o: 1 };        }      default:        console.log("MarchingSquaresJS-isoBands: edge index out of range!");        console.log(cell);        break;    }  }  return null;}function getExitXY(cell, x, y, o) {  var e,    id_x,    d_x,    d_y,    cval = cell.cval;  var d_o;  switch (x) {    case -1:      switch (o) {        case 0:          e = isoBandEdgeRB[cval];          d_x = isoBandNextXRB[cval];          d_y = isoBandNextYRB[cval];          d_o = isoBandNextORB[cval];          break;        default:          e = isoBandEdgeRT[cval];          d_x = isoBandNextXRT[cval];          d_y = isoBandNextYRT[cval];          d_o = isoBandNextORT[cval];          break;      }      break;    case 1:      switch (o) {        case 0:          e = isoBandEdgeLB[cval];          d_x = isoBandNextXLB[cval];          d_y = isoBandNextYLB[cval];          d_o = isoBandNextOLB[cval];          break;        default:          e = isoBandEdgeLT[cval];          d_x = isoBandNextXLT[cval];          d_y = isoBandNextYLT[cval];          d_o = isoBandNextOLT[cval];          break;      }      break;    default:      switch (y) {        case -1:          switch (o) {            case 0:              e = isoBandEdgeTL[cval];              d_x = isoBandNextXTL[cval];              d_y = isoBandNextYTL[cval];              d_o = isoBandNextOTL[cval];              break;            default:              e = isoBandEdgeTR[cval];              d_x = isoBandNextXTR[cval];              d_y = isoBandNextYTR[cval];              d_o = isoBandNextOTR[cval];              break;          }          break;        case 1:          switch (o) {            case 0:              e = isoBandEdgeBL[cval];              d_x = isoBandNextXBL[cval];              d_y = isoBandNextYBL[cval];              d_o = isoBandNextOBL[cval];              break;            default:              e = isoBandEdgeBR[cval];              d_x = isoBandNextXBR[cval];              d_y = isoBandNextYBR[cval];              d_o = isoBandNextOBR[cval];              break;          }          break;      }      break;  }  id_x = cell.edges.indexOf(e);  if (typeof cell.edges[id_x] !== "undefined") {    deleteEdge(cell, id_x);  } else {    //console.log("wrong edges...");    //console.log(x + " " + y + " " + o);    //console.log(cell);    return null;  }  cval = cell.cval_real;  switch (e) {    case 0:      if (cval & Node1) {        /* node 1 within range */        x = cell.topleft;        y = 1;      } else {        /* node 1 below or above threshold */        x = 1;        y = cell.righttop;      }      break;    case 1:      if (cval & Node2) {        x = 1;        y = cell.rightbottom;      } else {        x = cell.topleft;        y = 1;      }      break;    case 2:      if (cval & Node2) {        x = cell.topleft;        y = 1;      } else {        x = cell.bottomright;        y = 0;      }      break;    case 3:      if (cval & Node3) {        x = cell.bottomleft;        y = 0;      } else {        x = cell.topleft;        y = 1;      }      break;    case 4:      if (cval & Node1) {        x = cell.topright;        y = 1;      } else {        x = 1;        y = cell.righttop;      }      break;    case 5:      if (cval & Node2) {        x = 1;        y = cell.rightbottom;      } else {        x = cell.topright;        y = 1;      }      break;    case 6:      if (cval & Node2) {        x = cell.topright;        y = 1;      } else {        x = cell.bottomright;        y = 0;      }      break;    case 7:      if (cval & Node3) {        x = cell.bottomleft;        y = 0;      } else {        x = cell.topright;        y = 1;      }      break;    case 8:      if (cval & Node2) {        x = 1;        y = cell.righttop;      } else {        x = cell.bottomright;        y = 0;      }      break;    case 9:      if (cval & Node3) {        x = cell.bottomleft;        y = 0;      } else {        x = 1;        y = cell.righttop;      }      break;    case 10:      if (cval & Node3) {        x = 1;        y = cell.righttop;      } else {        x = 0;        y = cell.leftbottom;      }      break;    case 11:      if (cval & Node0) {        x = 0;        y = cell.lefttop;      } else {        x = 1;        y = cell.righttop;      }      break;    case 12:      if (cval & Node2) {        x = 1;        y = cell.rightbottom;      } else {        x = cell.bottomright;        y = 0;      }      break;    case 13:      if (cval & Node3) {        x = cell.bottomleft;        y = 0;      } else {        x = 1;        y = cell.rightbottom;      }      break;    case 14:      if (cval & Node3) {        x = 1;        y = cell.rightbottom;      } else {        x = 0;        y = cell.leftbottom;      }      break;    case 15:      if (cval & Node0) {        x = 0;        y = cell.lefttop;      } else {        x = 1;        y = cell.rightbottom;      }      break;    case 16:      if (cval & Node2) {        x = 0;        y = cell.leftbottom;      } else {        x = cell.bottomright;        y = 0;      }      break;    case 17:      if (cval & Node0) {        x = 0;        y = cell.lefttop;      } else {        x = cell.bottomright;        y = 0;      }      break;    case 18:      if (cval & Node3) {        x = cell.bottomleft;        y = 0;      } else {        x = 0;        y = cell.leftbottom;      }      break;    case 19:      if (cval & Node0) {        x = 0;        y = cell.lefttop;      } else {        x = cell.bottomleft;        y = 0;      }      break;    case 20:      if (cval & Node0) {        x = 0;        y = cell.leftbottom;      } else {        x = cell.topleft;        y = 1;      }      break;    case 21:      if (cval & Node1) {        x = cell.topright;        y = 1;      } else {        x = 0;        y = cell.leftbottom;      }      break;    case 22:      if (cval & Node0) {        x = 0;        y = cell.lefttop;      } else {        x = cell.topleft;        y = 1;      }      break;    case 23:      if (cval & Node1) {        x = cell.topright;        y = 1;      } else {        x = 0;        y = cell.lefttop;      }      break;    default:      console.log("MarchingSquaresJS-isoBands: edge index out of range!");      console.log(cell);      return null;  }  if (    typeof x === "undefined" ||    typeof y === "undefined" ||    typeof d_x === "undefined" ||    typeof d_y === "undefined" ||    typeof d_o === "undefined"  ) {    console.log("MarchingSquaresJS-isoBands: undefined value!");    console.log(cell);    console.log(x + " " + y + " " + d_x + " " + d_y + " " + d_o);  }  return { p: [x, y], x: d_x, y: d_y, o: d_o };}function BandGrid2Areas(grid) {  var areas = [];  var area_idx = 0;  grid.cells.forEach(function (g, j) {    g.forEach(function (gg, i) {      if (typeof gg !== "undefined") {        var a = polygon_table[gg.cval](gg);        if (typeof a === "object" && isArray(a)) {          if (typeof a[0] === "object" && isArray(a[0])) {            if (typeof a[0][0] === "object" && isArray(a[0][0])) {              a.forEach(function (aa) {                aa.forEach(function (aaa) {                  aaa[0] += i;                  aaa[1] += j;                });                areas[area_idx++] = aa;              });            } else {              a.forEach(function (aa) {                aa[0] += i;                aa[1] += j;              });              areas[area_idx++] = a;            }          } else {            console.log(              "MarchingSquaresJS-isoBands: bandcell polygon with malformed coordinates"            );          }        } else {          console.log(            "MarchingSquaresJS-isoBands: bandcell polygon with null coordinates"          );        }      }    });  });  return areas;}/** * Takes a square or rectangular grid {@link FeatureCollection} of {@link Point} features with z-values and an array of * value breaks and generates filled contour isobands. * * @name isobands * @param {FeatureCollection<Point>} pointGrid input points - must be square or rectangular * @param {Array<number>} breaks where to draw contours * @param {Object} [options={}] options on output * @param {string} [options.zProperty='elevation'] the property name in `points` from which z-values will be pulled * @param {Object} [options.commonProperties={}] GeoJSON properties passed to ALL isobands * @param {Array<Object>} [options.breaksProperties=[]] GeoJSON properties passed, in order, to the correspondent isoband (order defined by breaks) * @returns {FeatureCollection<MultiPolygon>} a FeatureCollection of {@link MultiPolygon} features representing isobands */function isobands(pointGrid, breaks, options) {  // Optional parameters  options = options || {};  if (!isObject(options)) throw new Error("options is invalid");  var zProperty = options.zProperty || "elevation";  var commonProperties = options.commonProperties || {};  var breaksProperties = options.breaksProperties || [];  // Validation  collectionOf(pointGrid, "Point", "Input must contain Points");  if (!breaks) throw new Error("breaks is required");  if (!Array.isArray(breaks)) throw new Error("breaks is not an Array");  if (!isObject(commonProperties))    throw new Error("commonProperties is not an Object");  if (!Array.isArray(breaksProperties))    throw new Error("breaksProperties is not an Array");  // Isoband methods  var matrix = gridToMatrix(pointGrid, { zProperty: zProperty, flip: true });  var contours = createContourLines(matrix, breaks, zProperty);  contours = rescaleContours(contours, matrix, pointGrid);  var multipolygons = contours.map(function (contour, index) {    if (breaksProperties[index] && !isObject(breaksProperties[index])) {      throw new Error("Each mappedProperty is required to be an Object");    }    // collect all properties    var contourProperties = objectAssign(      {},      commonProperties,      breaksProperties[index]    );    contourProperties[zProperty] = contour[zProperty];    var multiP = multiPolygon(contour.groupedRings, contourProperties);    return multiP;  });  return featureCollection(multipolygons);}/** * Creates the contours lines (featuresCollection of polygon features) from the 2D data grid * * Marchingsquares process the grid data as a 3D representation of a function on a 2D plane, therefore it * assumes the points (x-y coordinates) are one 'unit' distance. The result of the IsoBands function needs to be * rescaled, with turfjs, to the original area and proportions on the map * * @private * @param {Array<Array<number>>} matrix Grid Data * @param {Array<number>} breaks Breaks * @param {string} [property='elevation'] Property * @returns {Array<any>} contours */function createContourLines(matrix, breaks, property) {  var contours = [];  for (var i = 1; i < breaks.length; i++) {    var lowerBand = +breaks[i - 1]; // make sure the breaks value is a number    var upperBand = +breaks[i];    var isobandsCoords = isoBands(matrix, lowerBand, upperBand - lowerBand);    // as per GeoJson rules for creating a Polygon, make sure the first element    // in the array of LinearRings represents the exterior ring (i.e. biggest area),    // and any subsequent elements represent interior rings (i.e. smaller area);    // this avoids rendering issues of the MultiPolygons on the map    var nestedRings = orderByArea(isobandsCoords);    var groupedRings = groupNestedRings(nestedRings);    var obj = {};    obj["groupedRings"] = groupedRings;    obj[property] = lowerBand + "-" + upperBand;    contours.push(obj);  }  return contours;}/** * Transform isobands of 2D grid to polygons for the map * * @private * @param {Array<any>} contours Contours * @param {Array<Array<number>>} matrix Grid Data * @param {Object} points Points by Latitude * @returns {Array<any>} contours */function rescaleContours(contours, matrix, points) {  // get dimensions (on the map) of the original grid  var gridBbox = bbox(points); // [ minX, minY, maxX, maxY ]  var originalWidth = gridBbox[2] - gridBbox[0];  var originalHeigth = gridBbox[3] - gridBbox[1];  // get origin, which is the first point of the last row on the rectangular data on the map  var x0 = gridBbox[0];  var y0 = gridBbox[1];  // get number of cells per side  var matrixWidth = matrix[0].length - 1;  var matrixHeight = matrix.length - 1;  // calculate the scaling factor between matrix and rectangular grid on the map  var scaleX = originalWidth / matrixWidth;  var scaleY = originalHeigth / matrixHeight;  var resize = function (point) {    point[0] = point[0] * scaleX + x0;    point[1] = point[1] * scaleY + y0;  };  // resize and shift each point/line of the isobands  contours.forEach(function (contour) {    contour.groupedRings.forEach(function (lineRingSet) {      lineRingSet.forEach(function (lineRing) {        lineRing.forEach(resize);      });    });  });  return contours;}/*  utility functions *//** * Returns an array of coordinates (of LinearRings) in descending order by area * * @private * @param {Array<LineString>} ringsCoords array of closed LineString * @returns {Array} array of the input LineString ordered by area */function orderByArea(ringsCoords) {  var ringsWithArea = [];  var areas = [];  ringsCoords.forEach(function (coords) {    // var poly = polygon([points]);    var ringArea = area(polygon([coords]));    // create an array of areas value    areas.push(ringArea);    // associate each lineRing with its area    ringsWithArea.push({ ring: coords, area: ringArea });  });  areas.sort(function (a, b) {    // bigger --> smaller    return b - a;  });  // create a new array of linearRings coordinates ordered by their area  var orderedByArea = [];  areas.forEach(function (area) {    for (var lr = 0; lr < ringsWithArea.length; lr++) {      if (ringsWithArea[lr].area === area) {        orderedByArea.push(ringsWithArea[lr].ring);        ringsWithArea.splice(lr, 1);        break;      }    }  });  return orderedByArea;}/** * Returns an array of arrays of coordinates, each representing * a set of (coordinates of) nested LinearRings, * i.e. the first ring contains all the others * * @private * @param {Array} orderedLinearRings array of coordinates (of LinearRings) in descending order by area * @returns {Array<Array>} Array of coordinates of nested LinearRings */function groupNestedRings(orderedLinearRings) {  // create a list of the (coordinates of) LinearRings  var lrList = orderedLinearRings.map(function (lr) {    return { lrCoordinates: lr, grouped: false };  });  var groupedLinearRingsCoords = [];  while (!allGrouped(lrList)) {    for (var i = 0; i < lrList.length; i++) {      if (!lrList[i].grouped) {        // create new group starting with the larger not already grouped ring        var group = [];        group.push(lrList[i].lrCoordinates);        lrList[i].grouped = true;        var outerMostPoly = polygon([lrList[i].lrCoordinates]);        // group all the rings contained by the outermost ring        for (var j = i + 1; j < lrList.length; j++) {          if (!lrList[j].grouped) {            var lrPoly = polygon([lrList[j].lrCoordinates]);            if (isInside(lrPoly, outerMostPoly)) {              group.push(lrList[j].lrCoordinates);              lrList[j].grouped = true;            }          }        }        // insert the new group        groupedLinearRingsCoords.push(group);      }    }  }  return groupedLinearRingsCoords;}/** * @private * @param {Polygon} testPolygon polygon of interest * @param {Polygon} targetPolygon polygon you want to compare with * @returns {boolean} true if test-Polygon is inside target-Polygon */function isInside(testPolygon, targetPolygon) {  var points = explode(testPolygon);  for (var i = 0; i < points.features.length; i++) {    if (!booleanPointInPolygon(points.features[i], targetPolygon)) {      return false;    }  }  return true;}/** * @private * @param {Array<Object>} list list of objects which might contain the 'group' attribute * @returns {boolean} true if all the objects in the list are marked as grouped */function allGrouped(list) {  for (var i = 0; i < list.length; i++) {    if (list[i].grouped === false) {      return false;    }  }  return true;}export default isobands;
 |