Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 放置无重叠矩形的算法或方法是什么_Algorithm_Matlab - Fatal编程技术网

Algorithm 放置无重叠矩形的算法或方法是什么

Algorithm 放置无重叠矩形的算法或方法是什么,algorithm,matlab,Algorithm,Matlab,我有一个12*12的大矩形。现在我已经在这个矩形的地板上放置了6个矩形。我知道预装模块的中心坐标。现在我有另外14个长方形放在那个长方形的地板上。如何做到这一点 这里我所有预先放置的块都有中心坐标,比如(2,5),(5,7),(9,2),(7,8),(11,9),(3,11) 现在,我如何在这层楼里再放置14个长方形,这样它就不会与任何预先放置的块重叠。 我想用MATLAB编写代码。但是我应该采用什么方法呢?对于这样一个小的数字,将每个矩形放在一个列表中。每次添加新矩形时,请确保新矩形不会与任何

我有一个12*12的大矩形。现在我已经在这个矩形的地板上放置了6个矩形。我知道预装模块的中心坐标。现在我有另外14个长方形放在那个长方形的地板上。如何做到这一点

这里我所有预先放置的块都有中心坐标,比如(2,5),(5,7),(9,2),(7,8),(11,9),(3,11)

现在,我如何在这层楼里再放置14个长方形,这样它就不会与任何预先放置的块重叠。
我想用MATLAB编写代码。但是我应该采用什么方法呢?

对于这样一个小的数字,将每个矩形放在一个列表中。每次添加新矩形时,请确保新矩形不会与任何现有矩形重叠

这是O(n^2),所以如果你打算增加到10^3或更多的矩形,你需要一个更好的算法,但如果不是这样,你就可以了


现在,如果您的问题指定您可能无法适应所有这些,那么您将不得不回溯并继续尝试不同的地方。那是一个N!问题,但如果你有大量的开放空间,许多解决方案将是可能的

使用如此小的数字,将每个矩形放入列表中。每次添加新矩形时,请确保新矩形不会与任何现有矩形重叠

这是O(n^2),所以如果你打算增加到10^3或更多的矩形,你需要一个更好的算法,但如果不是这样,你就可以了


现在,如果您的问题指定您可能无法适应所有这些,那么您将不得不回溯并继续尝试不同的地方。那是一个N!问题,但如果你有大量的开放空间,许多解决方案将是可能的

使用如此小的数字,将每个矩形放入列表中。每次添加新矩形时,请确保新矩形不会与任何现有矩形重叠

这是O(n^2),所以如果你打算增加到10^3或更多的矩形,你需要一个更好的算法,但如果不是这样,你就可以了


现在,如果您的问题指定您可能无法适应所有这些,那么您将不得不回溯并继续尝试不同的地方。那是一个N!问题,但如果你有大量的开放空间,许多解决方案将是可能的

使用如此小的数字,将每个矩形放入列表中。每次添加新矩形时,请确保新矩形不会与任何现有矩形重叠

这是O(n^2),所以如果你打算增加到10^3或更多的矩形,你需要一个更好的算法,但如果不是这样,你就可以了


现在,如果您的问题指定您可能无法适应所有这些,那么您将不得不回溯并继续尝试不同的地方。那是一个N!问题,但如果你有大量的开放空间,许多解决方案将是可能的

这里有一个用于检查两个矩形重叠的函数。您可以根据@Dov的想法循环它来检查更多的矩形

对于两个矩形
Ri,i=1,2
,其中心
(xi,yi)
及其边的一半长度
ai,bi>0
(假设边与坐标轴对齐)

以下是我基于上述等式的实现:

在我的代码中,我将
xcPosition
ycPosition
作为矩形的中心位置

function [ overLap, pivalue ] = checkOverlap( xcPosition1,ycPosition1,xcPosition2,ycPosition2,length1,breadth1,length2,breadth2 )

pix = max((xcPosition2 - xcPosition1 -(length1/2)-(length2/2)),(xcPosition1 -xcPosition2 -(length2/2)-(length1/2)));
piy = max((ycPosition2 - ycPosition1 -(breadth1/2)-(breadth2/2)),(ycPosition1 -ycPosition2 -(breadth2/2)-(breadth1/2))); 
pivalue = max(pix, piy); 

if (pivalue < 0)
    overLap = 1;  %// Overlap exists 
else
    overLap = 0;  %// No overlap
end
end
另外,
length
width
是矩形边的大小

function [ overLap, pivalue ] = checkOverlap( xcPosition1,ycPosition1,xcPosition2,ycPosition2,length1,breadth1,length2,breadth2 )

pix = max((xcPosition2 - xcPosition1 -(length1/2)-(length2/2)),(xcPosition1 -xcPosition2 -(length2/2)-(length1/2)));
piy = max((ycPosition2 - ycPosition1 -(breadth1/2)-(breadth2/2)),(ycPosition1 -ycPosition2 -(breadth2/2)-(breadth1/2))); 
pivalue = max(pix, piy); 

if (pivalue < 0)
    overLap = 1;  %// Overlap exists 
else
    overLap = 0;  %// No overlap
end
end

下面是一个检查两个矩形重叠的函数。您可以根据@Dov的想法循环它来检查更多的矩形

对于两个矩形
Ri,i=1,2
,其中心
(xi,yi)
及其边的一半长度
ai,bi>0
(假设边与坐标轴对齐)

以下是我基于上述等式的实现:

在我的代码中,我将
xcPosition
ycPosition
作为矩形的中心位置

function [ overLap, pivalue ] = checkOverlap( xcPosition1,ycPosition1,xcPosition2,ycPosition2,length1,breadth1,length2,breadth2 )

pix = max((xcPosition2 - xcPosition1 -(length1/2)-(length2/2)),(xcPosition1 -xcPosition2 -(length2/2)-(length1/2)));
piy = max((ycPosition2 - ycPosition1 -(breadth1/2)-(breadth2/2)),(ycPosition1 -ycPosition2 -(breadth2/2)-(breadth1/2))); 
pivalue = max(pix, piy); 

if (pivalue < 0)
    overLap = 1;  %// Overlap exists 
else
    overLap = 0;  %// No overlap
end
end
另外,
length
width
是矩形边的大小

function [ overLap, pivalue ] = checkOverlap( xcPosition1,ycPosition1,xcPosition2,ycPosition2,length1,breadth1,length2,breadth2 )

pix = max((xcPosition2 - xcPosition1 -(length1/2)-(length2/2)),(xcPosition1 -xcPosition2 -(length2/2)-(length1/2)));
piy = max((ycPosition2 - ycPosition1 -(breadth1/2)-(breadth2/2)),(ycPosition1 -ycPosition2 -(breadth2/2)-(breadth1/2))); 
pivalue = max(pix, piy); 

if (pivalue < 0)
    overLap = 1;  %// Overlap exists 
else
    overLap = 0;  %// No overlap
end
end

下面是一个检查两个矩形重叠的函数。您可以根据@Dov的想法循环它来检查更多的矩形

对于两个矩形
Ri,i=1,2
,其中心
(xi,yi)
及其边的一半长度
ai,bi>0
(假设边与坐标轴对齐)

以下是我基于上述等式的实现:

在我的代码中,我将
xcPosition
ycPosition
作为矩形的中心位置

function [ overLap, pivalue ] = checkOverlap( xcPosition1,ycPosition1,xcPosition2,ycPosition2,length1,breadth1,length2,breadth2 )

pix = max((xcPosition2 - xcPosition1 -(length1/2)-(length2/2)),(xcPosition1 -xcPosition2 -(length2/2)-(length1/2)));
piy = max((ycPosition2 - ycPosition1 -(breadth1/2)-(breadth2/2)),(ycPosition1 -ycPosition2 -(breadth2/2)-(breadth1/2))); 
pivalue = max(pix, piy); 

if (pivalue < 0)
    overLap = 1;  %// Overlap exists 
else
    overLap = 0;  %// No overlap
end
end
另外,
length
width
是矩形边的大小

function [ overLap, pivalue ] = checkOverlap( xcPosition1,ycPosition1,xcPosition2,ycPosition2,length1,breadth1,length2,breadth2 )

pix = max((xcPosition2 - xcPosition1 -(length1/2)-(length2/2)),(xcPosition1 -xcPosition2 -(length2/2)-(length1/2)));
piy = max((ycPosition2 - ycPosition1 -(breadth1/2)-(breadth2/2)),(ycPosition1 -ycPosition2 -(breadth2/2)-(breadth1/2))); 
pivalue = max(pix, piy); 

if (pivalue < 0)
    overLap = 1;  %// Overlap exists 
else
    overLap = 0;  %// No overlap
end
end

下面是一个检查两个矩形重叠的函数。您可以根据@Dov的想法循环它来检查更多的矩形

对于两个矩形
Ri,i=1,2
,其中心
(xi,yi)
及其边的一半长度
ai,bi>0
(假设边与坐标轴对齐)

以下是我基于上述等式的实现:

在我的代码中,我将
xcPosition
ycPosition
作为矩形的中心位置

function [ overLap, pivalue ] = checkOverlap( xcPosition1,ycPosition1,xcPosition2,ycPosition2,length1,breadth1,length2,breadth2 )

pix = max((xcPosition2 - xcPosition1 -(length1/2)-(length2/2)),(xcPosition1 -xcPosition2 -(length2/2)-(length1/2)));
piy = max((ycPosition2 - ycPosition1 -(breadth1/2)-(breadth2/2)),(ycPosition1 -ycPosition2 -(breadth2/2)-(breadth1/2))); 
pivalue = max(pix, piy); 

if (pivalue < 0)
    overLap = 1;  %// Overlap exists 
else
    overLap = 0;  %// No overlap
end
end
另外,
length
width
是矩形边的大小

function [ overLap, pivalue ] = checkOverlap( xcPosition1,ycPosition1,xcPosition2,ycPosition2,length1,breadth1,length2,breadth2 )

pix = max((xcPosition2 - xcPosition1 -(length1/2)-(length2/2)),(xcPosition1 -xcPosition2 -(length2/2)-(length1/2)));
piy = max((ycPosition2 - ycPosition1 -(breadth1/2)-(breadth2/2)),(ycPosition1 -ycPosition2 -(breadth2/2)-(breadth1/2))); 
pivalue = max(pix, piy); 

if (pivalue < 0)
    overLap = 1;  %// Overlap exists 
else
    overLap = 0;  %// No overlap
end
end

如果一个好的位置很重要,我建议你去看看。在这个问题中,您将使用模拟力,根据库仑定律,将矩形推开并远离边界矩形。初始配置是随机选择的。我想,你会想让矩形的质量与其面积成比例。由于边缘的原因,您没有任何弹簧力,这使它更容易。在Matlab中,求解运动微分方程的迭代将很容易。或者很可能有一个工具箱为你做这件事

不幸的是,对于这样的约束问题,固定矩形