Оптимизированное получение двумерного массива координат элементов HTML выделенной области

Всем привет, уже неоднократно пытался собрать массив из элементов HTML(SVG элемента) собрать координаты точек.

На текущий момент алгоритм следующий:

  • делаю перебор выделенных элементов, получаю минимальные и максимальные значения x\y
  • из полученных данных известны размеры матрицы
    [Xmin, Ymin; Xmax, Ymin]
    [Xmin, Ymax; Xmax, Ymax]
  • делаю перебор по Y(y):
    • делаю перебор по X(x):
      • проверяю есть ли элемент по указанным координатам, если да, то добавляю координаты в массив [y][x][{x,y}], если нет - NULL
  • делаю перебор по массиву результата
    • при условии данных отличных от NULL, делаю преобразование относительно точек внутри массива.

Подскажите как это сделать правильно, без многочисленных переборов.
Спасибо

вот мой кривой код ))

function radialMatrix(selectedItems, grad, radius, plus) {
  var stepmove = 1;
  var endtop = [];
  var type = type || 0;
  var A = 0;
  var PI2 = Math.PI * 2;
  var tmpcount = 4;
  var tempElm;
  var tempX;
  var tempY;
  var req = false;
  var TEMP = null, xy = [], item;
  var xElm = 0, yElm = 0, idElm = null;
  var xMinElm = 32167, yMinElm = 32167;
  var xMaxElm = -32167, yMaxElm = -32167;
  var radiusElmX = 0, radiusElmY = 0;

  matrixResult = [];
  matrixMiddle = [];
  matrixResult = [];
  matrixSeatsMiddle = [];
  matrixSeatsResult = [];

  for (var i = 0; i < selectedItems.length; i++) {
    item = document.getElementById(selectedItems[i]);
    xElm = parseInt(item.getAttribute('x'));
    yElm = parseInt(item.getAttribute('y'));
    idElm = item.id;

    xy = [xElm, yElm, idElm];

    if(xElm != null && yElm != null) {
      if(xElm < xMinElm) xMinElm = xElm;
      if(xElm > xMaxElm) xMaxElm = xElm;
      if(yElm < yMinElm) yMinElm = yElm;
      if(yElm > yMaxElm) yMaxElm = yElm;
    }
  }
  radiusElmX = xMaxElm - xMinElm;
  if(radius == null)
    radius = parseInt(radiusElmX / 3);
  radiusElmY = yMaxElm - yMinElm;

  var rad = radiusElmX * 2 * Math.PI / 360;

  var id = null;
  for(y = yMinElm; y <= yMaxElm; y++) {
    // matrixSeatsMiddle = []
    matrixMiddle = [];
    for(x = xMinElm; x <= xMaxElm; x++) {
      var isY = false;
      item = $("rect[x='" + x + "'][y='" + y + "']");
      if(item.length > 0) {
        id = item.attr("id");
        matrixMiddle.push(id);
      } else {
        matrixMiddle.push(null);
      }
    }
    matrixSeatsMiddle.push(matrixMiddle);
  }

  matrixResult.push(matrixSeatsMiddle);
  matrixSeatsResult = matrixSeatsMiddle;

  dA = Math.PI / radiusElmX; //matrixSeatsResult[0].length;// / 2;
  for(a = 0; a < matrixSeatsResult.length; a++) {
    A = parseInt(grad);
    endtop = [];
    req = false;

    for(i = 0; i < matrixSeatsResult[a].length; i++) {
      var aaa = matrixSeatsResult[a].length;
      // var bbb = matrixSeatsResult[a][0].length;
      var tempElm = document.getElementById(matrixSeatsResult[a][i]) || null;
      if(tempElm == null) {
        tempX = null;
        tempY = null;
      } else {
        tempX = tempElm.getAttribute("x") || null;
        tempY = tempElm.getAttribute("y") || null;
      }
      if((tempElm !== null) && (tempElm.id.indexOf("row") > 0)) {
        if(plus)
          ttt = Math.round(parseFloat(tempY) + parseFloat(radius * Math.sin(A)));
        else
          ttt = Math.round(parseFloat(tempY) - parseFloat(radius * Math.sin(A)));
        A += dA;
        if(A >= PI2) A -= PI2;
        else if(A < 0) A += PI2;
        tempElm.setAttribute("y", ttt);
      } else {
        A += dA;
        if(A >= PI2) A -= PI2;
        else if(A < 0) A += PI2;
      }
    }
  }
}


Ответы (0 шт):