Algorithm 放置无重叠矩形的算法或方法是什么
我有一个12*12的大矩形。现在我已经在这个矩形的地板上放置了6个矩形。我知道预装模块的中心坐标。现在我有另外14个长方形放在那个长方形的地板上。如何做到这一点 这里我所有预先放置的块都有中心坐标,比如(2,5),(5,7),(9,2),(7,8),(11,9),(3,11) 现在,我如何在这层楼里再放置14个长方形,这样它就不会与任何预先放置的块重叠。Algorithm 放置无重叠矩形的算法或方法是什么,algorithm,matlab,Algorithm,Matlab,我有一个12*12的大矩形。现在我已经在这个矩形的地板上放置了6个矩形。我知道预装模块的中心坐标。现在我有另外14个长方形放在那个长方形的地板上。如何做到这一点 这里我所有预先放置的块都有中心坐标,比如(2,5),(5,7),(9,2),(7,8),(11,9),(3,11) 现在,我如何在这层楼里再放置14个长方形,这样它就不会与任何预先放置的块重叠。 我想用MATLAB编写代码。但是我应该采用什么方法呢?对于这样一个小的数字,将每个矩形放在一个列表中。每次添加新矩形时,请确保新矩形不会与任何
我想用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中,求解运动微分方程的迭代将很容易。或者很可能有一个工具箱为你做这件事 不幸的是,对于这样的约束问题,固定矩形