2D ビン パッキング用の FNF アルゴリズムを作成しようとしていますが、メソッドを呼び出すと、間違った結果が得られます。助けてください、問題が見つかりません。
private void FFF()
{
int xmax = 0;
int movex = 0;
int movey = 0;
int maxH = RectBin.Height;
int maxW = RectBin.Width;
List<Rectangle> rectsToDraw = new List<Rectangle>();
for (int i = 0; i < Shapes.Count; i++)
{
int height = Shapes[i].Height;
int width = Shapes[i].Width;
if ((movey + height) <= maxH)
{
rectsToDraw.Add(new Rectangle(movex, movey, width, height));
movey = movey + height;
if (xmax < movex + width)
{
xmax = movex + width;
}
}
else if ((xmax + width) <= maxW)
{
movex = xmax;
rectsToDraw.Add(new Rectangle(movex, 0, width, height));
movey = height;
xmax = movex + width;
}
else
{
Debug.Write("Message1");
break;
}
}
for (int j = 0; j < rectsToDraw.Count; j++)
{
Debug.Write(rectsToDraw[0]);
}
r2d = rectsToDraw;
}
rectBin はパブリックな四角形 (0,0, 300, 190) で、Shapes[] はパブリックな四角形のリストです。ここで使用する前に、次の方法でシェイプを並べ替えます。
private void button9_Click(object sender, EventArgs e)
{
Shapes.Sort((x,y) => ((y.Width.CompareTo(x.Width))));
}
デバッグ コンソールで FNF を開始すると、14 個のアイテムを取得する必要があるときに、リスト アイテムとメッセージ 1 (形状の最初のアイテムであり、これは繰り返されるべきではありません) が繰り返し表示されます。
明確にするために、私はアルゴリズムを探しているのではなく、oblici の最初の項目が rectsToDraw に 4 回コピーされ、ループが終了するように、どこで間違いを犯したかを教えてくれる人を探しているだけです...
入力: {X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46}{X=0,Y=0,幅=47 ,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0,Y=0,幅=38,高さ=47}{X=0,Y=0,幅= 33,高さ=45}{X=0,Y=0,幅=22,高さ=39}{X=0,Y=0,幅=0,高さ=0}
出力: {X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151 ,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅= 167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y=0 ,幅=115,高さ=52}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y= 0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y =0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=231,高さ=66}{X=0, Y=0、幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0 ,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y= 0,幅=58,高さ=46}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y =0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0, Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46}{X=0 ,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X= 0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X =0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46}{ X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0,Y=0,幅=231,高さ=66} {X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40 }{X=0、Y=0,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0 ,Y=0,幅=58,高さ=46}{X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X= 0,Y=0,幅=38,高さ=47}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X =0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{ X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46} {X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0,Y=0,幅=38,高さ=47 }{X=0,Y=0,幅=33,高さ=45}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ= 61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46}{X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0,Y=0,幅=38 ,高さ=47}{X=0,Y=0,幅=33,高さ=45}{X=0,Y=0,幅=22,高さ=39}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0 ,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y= 0,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y =0,幅=58,高さ=46}{X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0, Y=0,幅=38,高さ=47}{X=0,Y=0,幅=33,高さ=45}{X=0,Y=0,幅=22,高さ=39}{X=0 ,Y=0,幅=0,高さ=0}高さ=39}{X=0,Y=0,幅=0,高さ=0}高さ=39}{X=0,Y=0,幅=0,高さ=0}