2016-05-01 2 views
1

Я хочу связать объекты Rectangle-Objects в массиве, которые находятся рядом (рядом). Например: (Структура: "{х: х-постион, у: у-постион, x1: ширина, у1: высота}")Соедините прямоугольники, которые находятся рядом?

{x: 0, y: 0, x1: 3, y1: 2}, {x: 0, y: 2, x1: 3, y1: 2} 

можно положить вместе (как я хочу), чтобы:

{x: 0, y: 0, x1: 3, y1: 4} 

До сих пор я не мог найти решение для своей проблемы, так что надеюсь, вы сможете мне помочь. Это часть моего массива, где я хочу найти этот бок о боке - Прямоугольники и сохранить их в новом массиве:

[{x:0, y: 0, x1:3, y1:2},{x:0, y: 2, x1:3, y1:2},{x:0, y: 4, x1:3, y1:2},{x:0, y: 6, x1:3, y1:2},{x:0, y: 8, x1:3, y1:2},{x:0, y: 10, x1:3, y1:2},{x:0, y: 12, x1:3, y1:2},{x:0, y: 14, x1:3, y1:2},{x:0, y: 16, x1:3, y1:2},{x:0, y: 18, x1:3, y1:2},{x:0, y: 20, x1:3, y1:2},{x:0, y: 22, x1:3, y1:2},{x:0, y: 24, x1:3, y1:2},{x:0, y: 26, x1:3, y1:2},{x:0, y: 28, x1:3, y1:2},{x:0, y: 30, x1:3, y1:2}//[...]so on 
+0

ли x1 и y1 положение в нижнем правом углу или размер прямоугольника? –

+0

@adminXVII x1 и y1 - размер прямоугольника –

+0

имеют прямоугольники одинакового размера и являются позициями в сетке? –

ответ

0

Это должно быть сделано. Вначале я не мог понять, что прямоугольники были уложены друг на друга. Я должен был думать на всех условиях. Я считаю, что он рекурсивно ищет и объединяется везде, где размещаются прямоугольники, если их трогательные края одинаковы по размеру.

var rects = [{x:0, y: 0, x1:3, y1:2},{x:0, y: 2, x1:3, y1:2},{x:0, y: 4, x1:3, y1:2},{x:0, y: 6, x1:3, y1:2},{x:0, y: 8, x1:3, y1:2},{x:0, y: 10, x1:3, y1:2},{x:0, y: 12, x1:3, y1:2},{x:0, y: 14, x1:3, y1:2},{x:0, y: 16, x1:3, y1:2},{x:0, y: 18, x1:3, y1:2},{x:0, y: 20, x1:3, y1:2},{x:0, y: 22, x1:3, y1:2},{x:0, y: 24, x1:3, y1:2},{x:0, y: 26, x1:3, y1:2},{x:0, y: 28, x1:3, y1:2},{x:0, y: 30, x1:3, y1:2}]; 
 

 
function rectsReduce(arr){ 
 

 
    function mergeRects(r,sa,a,i){ 
 
    \t 
 
    function compare(r1,r2){ 
 
     return r1.y == r2.y ? r1.x > r2.x ? r1.x - r2.x == r2.x1 
 
             : r2.x - r1.x == r1.x1 
 
          : r1.x == r2.x ? r1.y > r2.y ? r1.y - r2.y == r2.y1 
 
                 : r2.y - r1.y == r1.y1 
 
             : false; 
 
    } 
 
    \t 
 
    var fi = sa.findIndex(e => compare(r,e))+i+1, 
 
    r2 = ~fi ? a.splice(fi,1)[0] : void 0; 
 
\t return !!r2 && { x : Math.min(r.x, r2.x), 
 
\t     y : Math.min(r.y, r2.y), 
 
\t     x1 : r.x == r2.x ? r.x1 : r.x1 + r2.x1, 
 
\t     y1 : r.y == r2.y ? r.y1 : r.y1 + r2.y1}; 
 
    } 
 
\t 
 
    return arr.reduce((p,c,i,a) => { var mergedRect = {}; 
 
            a.length > 1 && (mergedRect = mergeRects(c,p.slice(i+1),a,i), 
 
                !!mergedRect && (p[i] = mergedRect, 
 
                p = rectsReduce(p))); 
 
\t       return p},arr); \t 
 
} 
 

 
document.write("<pre>" + JSON.stringify(rectsReduce(rects)) + "</pre>");

0

An O (N^2) решение будет такое:

foreach rect as rect1: 
    foreach rect as rect2: 
    // rect1 above rect2 
    if rect1.x == rect2.x && rect1.x1 + rect1.x == rect2.x1 + rect2.x && rect1.y1 + rect1.y == rect2.y: 
     outrect = {rect1.x, rect1.x1, rect1.y, rect2.y1+rect1.y1} 
     array.remove(rect1,rect2) 
     array.add(outrect) 
    // rect1 below rect2 
    else if rect1.x == rect2.x && rect1.x1 + rect1.x == rect2.x1 + rect2.x && rect1.y == rect2.y1 + rect2.y: 
     outrect = {rect1.x, rect1.x1 + rect1.x, rect2.y, rect2.y1+rect1.y1} 
     array.remove(rect1,rect2) 
     array.add(outrect) 
    // rect1 at right of rect2 
    else if rect1.y == rect2.y && rect1.y1 + rect1.y == rect2.y1 + rect2.y && rect1.x == rect2.x1 + rect2.x: 
     outrect = {rect2.x, rect1.x1 + rect2.x1, rect1.y, rect1.y1} 
     array.remove(rect1,rect2) 
     array.add(outrect) 
    // rect1 at left of rect2 
    else if rect1.y == rect2.y && rect1.y1 + rect1.y == rect2.y1 + rect2.y && rect2.x == rect1.x1 + rect1.x: 
     outrect = {rect1.x, rect1.x1 + rect2.x1, rect1.y, rect1.y1} 
     array.remove(rect1,rect2) 
     array.add(outrect) 

(BTW это только псевдокод)

+0

Что означает «O (n^2)»? –

+0

Это порядок роста. Это означает, что время, затрачиваемое этой функцией, соответствует квадрату числа прямоугольников (что может быть значительным, если у вас есть, скажем, тысяча прямоугольников) –

+1

При повторении идентичных наборов ваш внутренний цикл должен только проверяться на внешние контуры position + 1 (как мне недавно напомнили последние [Q & A] (http://stackoverflow.com/questions/36745286/html5-canvas-draw-line-distance-between-points/36766325#36766325)). – markE

Смежные вопросы