更新
关于您的代码,我不明白是什么问题,因为不清楚。我想给你一些提示:
- 当你需要和某人一起工作时(比如这里,如果你需要帮助,或者在一个项目中等),你应该分享你知道的相同的东西。
- 在这种情况下,语言不是规范,你应该尽可能地抽象代码,伪代码是一个好的开始。
-您可以通过一些示例以及图像和方案来描述您遇到的问题。
- 如果您添加特定的编码来代表问题,您应该尊重该编码。
目前还不清楚您的代码是如何工作的,因为它似乎是 js 和伪代码之间的混合体。据我所知,第一个逻辑错误似乎与空间划分(行列)有关:例如,如果您有 4 个元素 1x1(行 x 列),它们将填充 1 行但是,如果您有 1 个元素 1x1 ,1 个元素 2x1(行 x 列)、1 个元素 1x1(行 x 列)和另一个元素 2x1(行 x 列),它们完成了一行,但您也会在下面的行中找到一些片段,而您没有似乎在您的代码中注册了这种行为。
我希望能很好地理解,这里是jsfiddle,这里是代码:
<!DOCTYPE html>
<head>
<style>
.pad div{
margin:1px;
}
.pad{
background-color:#FFF;
border:#000 1px solid;
}
</style>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<body>
<script>
var pieceN=50;
var pieces = [];
const multip = 75;
var actualmaxheight=0;
const h=600;
const w=300;
const maxrows = 5;
const maxcols = 4;
var id="";
var actualcontent=0;
$('body').append('<div id="content'+actualcontent+'" class="pad" style="'+
'height:'+(h+4)+'px;width:'+(w+4)+'px"></div>');
id='content'+actualcontent;
actualcontent++;
//creating objects n times
for(var i=0; i<(pieceN); i++){
color=(Math.floor(Math.random()*16777215)).toString(16);
if(color.length==5){ color=color+'0'};
if(color.length==4){ color=color+'00'};
//for faster thing I'll use an already sorted array
eit = Math.floor((Math.random()*maxrows)+1);
wid = Math.floor((Math.random()*maxcols)+1);
pieces.push({
'height': eit*multip,
'width': wid*multip,
'rows': eit,
'cols': wid,
'color':'#'+color
});
}
var copy=pieces;
var i =0;
//while i is less then the number of the objects -1
//the last element will be inserted afther this cycle
//it can be also inserted in the cylce, anyway it's only 1 loop
while(i<pieces.length-1){
//if there is enough height for the element in the container
if(h-actualmaxheight>=parseInt(pieces[i].height)){
//the width fill te container width (insert)
if(parseInt(pieces[i].width)==w){
document.getElementById(id).innerHTML+=
'<div id="'+pieces.length+'" style="'+
'width:'+pieces[i].width+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>';
actualmaxheight+=parseInt(pieces[i].height);
}else{//if the width don't fill te container
//if this elem+nextone width fill the container width (insert x 2)
if(((parseInt(pieces[i].width)+parseInt(pieces[i+1].width))==w) && (parseInt(pieces[i].height)==parseInt(pieces[i+1].height))){
document.getElementById(id).innerHTML+=
'<div id="'+i+'" style="'+
'width:'+pieces[i].width+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>'+
'<div id="'+(i+1)+'" style="'+
'width:'+pieces[i+1].width+'px;'+
'height:'+pieces[i+1].height+'px;'+
'background-color:'+pieces[i+1].color+';'+
'float:left"></div>';
actualmaxheight+=parseInt(pieces[i].height);
i++;//because 2 inserted
}else{
//else we insert 1 elem + 1 filling element
document.getElementById(id).innerHTML+=
'<div id="'+i+'" style="'+
'width:'+pieces[i].width+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>'+
'<div id="'+(pieces.length+100)+'" style="'+
'width:'+(w-pieces[i].width)+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>';
actualmaxheight+=parseInt(pieces[i].height);
}
}
i++;//we surely inserted an elem
}else{
//else the container have not enough height for this elem
//fill the height with a black block and don't increase i
//because we inserted nothing
document.getElementById(id).innerHTML+=
'<div id="'+(pieces.length+1000)+'" style="'+
'width:'+w+'px;'+
'height:'+(h-actualmaxheight)+'px;'+
'background-color:#000000;'+
'float:left;color:#FFFFFF">here to fill H</div>';
$('body').append('<div id="content'+actualcontent+'" class="pad" style="'+
'height:'+(h+6+actualcontent*1.2)+'px;width:'+(w+4)+'px;color:#FFFFFF"></div>');
id='content'+actualcontent++; //id of the container updated
actualmaxheight=0;//reset height
}
}
//insert last element
i=pieces.length-1;//get its array index
if(h-actualmaxheight>=pieces[i].height){//there is enough height in this container
//the elem fill the width
if(parseInt(pieces[i].width)==w){
actualmaxheight+=pieces[i].height;
document.getElementById(id).innerHTML+=
'<div id="'+pieces.length+'" style="'+
'width:'+pieces[i].width+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>'+
'<div id="'+(pieces.length+1000)+'" style="'+
'width:'+w+'px;'+
'height:'+(h-actualmaxheight)+'px;'+
'background-color:#000000;color:#FFFFFF;'+
'float:left">here to fill H</div>';
}else{ //the elem don't fill the width
actualmaxheight+=pieces[i].height;
document.getElementById(id).innerHTML+=
'<div id="'+pieces.length+'" style="'+
'width:'+pieces[i].width+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>'+
'<div id="'+(pieces.length+10000)+'" style="'+
'width:'+(w-pieces[i].width)+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>'+
'<div id="'+(pieces.length+1000)+'" style="'+
'width:'+w+'px;'+
'height:'+(h-actualmaxheight)+'px;'+
'background-color:#000000;color:#FFFFFF;'+
'float:left">here to fill H</div>';
}
}else{//there is not enough height in this container
if(parseInt(pieces[i].width)==w){//the elem fill the width
//fill the height with a black block
document.getElementById(id).innerHTML+=
'<div id="'+(pieces.length+1000)+'" style="'+
'width:'+pieces[i].width+'px;'+
'height:'+(h-actualmaxheight)+'px;'+
'background-color:#000000;color:#FFFFFF;'+
'float:left">here to fill H</div>';
//create another container and add the elem + black block to fill the height
actualmaxheight=parseInt(pieces[i].height);
$('body').append('<div id="content'+actualcontent+'" class="pad" style="'+
'height:'+(h+4)+'px;width:'+(w+4)+'px">'+
'<div id="'+pieces.length+'" style="'+
'width:'+pieces[i].width+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>'+
'<div id="'+(pieces.length+1000)+'" style="'+
'width:'+w+'px;'+
'height:'+(h-actualmaxheight)+'px;'+
'background-color:#000000;color:#FFFFFF;'+
'float:left">here to fill H</div>'+
'</div>');
}else{//the elem don't fill the width
//fill the height with a black block to fill the height
document.getElementById(id).innerHTML+=
'<div id="'+(pieces.length+1000)+'" style="'+
'width:'+w+'px;'+
'height:'+(h-actualmaxheight)+'px;'+
'background-color:#000000;color:#FFFFFF;'+
'float:left">here to fill H</div>';
actualmaxheight=parseInt(pieces[i].height);
//create another container and add the elem + 1 elem to fill the width
//+ 1 black block to fill the height
$('body').append('<div id="content'+actualcontent+'" class="pad" style="'+
'height:'+(h+4)+'px;width:'+(w+4)+'px">'+
'<div id="'+pieces.length+'" style="'+
'width:'+pieces[i].width+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>'+
'<div id="'+(pieces.length+100)+'" style="'+
'width:'+(w-pieces[i].width)+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';'+
'float:left"></div>'+
'<div id="'+(pieces.length+1000)+'" style="'+
'width:'+w+'px;'+
'height:'+(h-actualmaxheight)+'px;'+
'background-color:#000000;color:#FFFFFF;'+
'float:left">here to fill H</div>'+
'</div>');
}
}
/*
//print the elments
for(var i=0; i<(copy.length); i++){
$('body').append('<div id="el'+i+'"'+
'style="width:'+copy[i].width+'px;'+
'height:'+copy[i].height+'px;'+
'background-color:'+copy[i].color+';float:left"></div>'
);
}
*/
</script>
</body>
</html>
我想澄清一些观点
- 对象尺寸是某物的倍数还是它们只是随机的?
- 您需要在哪里添加填充块,靠近您找不到另一块具有相同高度且宽度总和为 300 的块?
- 根据您要搜索的对象数量,一个对象可以与多个对象匹配或更少,这显然会增加所需的时间。
无论如何,为了呈现一些东西,我编写了这个算法(jsfiddle),它可能有用也可能没用,具体取决于你在搜索什么:
<!DOCTYPE html>
<head>
<style>
.pad div{
margin:1px;
}
.pad{
background-color:#FFF;
border:#000 1px solid;
}
</style>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<body>
<script>
var pieceN=50;
var pieces = [];
var actualmaxheight=0;
var h=600;
var w=300;
var flag=0;
$('body').append('<div id="content0" class="pad" style="'+
'height:'+(h+4)+'px;width:'+(w+4)+'px"></div>');
//creating objects n times
for(var i=0; i<(pieceN); i++){
color=(Math.floor(Math.random()*16777215)).toString(16);
if(color.length==5){ color=color+'0'};
//for faster thing I'll use an already sorted array
pieces.push({
'height': Math.floor((Math.random()*600)+1),
'width':Math.floor((Math.random()*150)+1),
'color':'#'+color
});
}
var copy=pieces;
id='content0';
//for all the elements aren't placed(i remove every placed element)
for(i=0;i<pieces.length;i++){
flag=0;
k=0;
//while k<pieces.length confront every piece[k] with piece[i]
while(k<pieces.length){
//if exist 2 piece with sum of width==w(300), the same height and the actual container have enough height, let's add them
if(parseInt(pieces[i].width)+parseInt(pieces[k].width)==w && pieces[i].height==pieces[k].height && ((h-actualmaxheight)>parseInt(pieces[i].height))){
document.getElementById(id).innerHTML+='<div id="e'+(i+k)+'"'+
'style="width:'+pieces[i].width+'px;'+
'height:'+pieces[i].height+'px;'+
'background-color:'+pieces[i].color+';float:left"></div>'+
'<div id="e'+(k+i)+'2"'+
'style="width:'+pieces[k].width+'px;'+
'height:'+pieces[k].height+'px;'+
'background-color:'+pieces[k].color+';float:left"></div>';
actualmaxheight+=parseInt(pieces[i].height);
//remove them from the array
pieces = $.grep( pieces, function(n,index){
return index != k;
});
pieces = $.grep( pieces, function(n,index){
return index != i;
});
flag=1;
}
k++;
}
//if we inserted 0 elements in the while before, we have 2 reason
//1) there aren't 2 elements which satisfy the rules
//in this case we add the element with an element created to fill the empty space orizontal
if(flag==0){
for(j=0;j<pieces.length;j++){
if((h-actualmaxheight)>parseInt(pieces[j].height)){
document.getElementById(id).innerHTML+='<div id="e'+i+'"'+
'style="width:'+pieces[j].width+'px;'+
'height:'+pieces[j].height+'px;'+
'background-color:'+pieces[j].color+';float:left"></div>'+
'<div id="e'+i+'2"'+
'style="width:'+(w-parseInt(pieces[j].width))+'px;'+
'height:'+pieces[j].height+'px;'+
'background-color:'+pieces[j].color+';float:left"></div>';
actualmaxheight+=parseInt(pieces[j].height);
pieces = $.grep( pieces, function(n,index){
return index != j;
});
}
}
}
//2) there isn't an element which can be conained in the space remained in the container
//in this case we add a black stripe to fill the space vertical
if(actualmaxheight<h){
document.getElementById(id).innerHTML+='<div id="e'+j+i*k+'"'+
'style="width:300px;'+
'height:'+(h-actualmaxheight)+'px;'+
'background-color:#000000;float:left;color:#FFFFFF">i fill the space</div>';
}
//then we create a new container to repeat until all the elements are placed
$('body').append('<div class="pad" id="content'+j+'"'+
'style="margin-top:10px;'+
'height:'+(h+4)+'px;width:'+(w+4)+'px"></div>');
id='content'+j;
actualmaxheight=0;
i=0;
}
//print the elments
for(var i=0; i<(copy.length); i++){
$('body').append('<div id="el'+i+'"'+
'style="width:'+copy[i].width+'px;'+
'height:'+copy[i].height+'px;'+
'background-color:'+copy[i].color+';float:left"></div>'
);
}
</script>
</body>
</html>