Оптимизированное получение двумерного массива координат элементов 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;
}
}
}
}