一个关于拼图算法的问题(倾家荡产高分结贴)

michealanly 2010-11-15 08:17:25
现在随机生成一些PictrueBox 控件,如何把这些pictureBox合理的拼在一个Panel控件里,每个PictrueBox控件不可有重叠的部门,只能是边与边相切。pictrueBox的宽与高可以互换(此为模拟旋转90度)。还有要注意的是PictrueBox必须被Panel包含。
非常感谢您的解答,有答案的话可以回贴或发送到我的邮箱3313319@qq.com.向无私的好同志致敬
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
RandPictrueBox();
}

public void RandPictrueBox()
{
panel1.Controls.Clear();

Random rad = new Random();
List<PictureBox> lst = new List<PictureBox>();
int areas = 0;
while (areas < panel1.Width * panel1.Height)
{
PictureBox picBox = new PictureBox();
picBox.MouseDown += new MouseEventHandler(picBox_MouseDown);
picBox.MouseMove += new MouseEventHandler(picBox_MouseMove);
picBox.MouseUp += new MouseEventHandler(picBox_MouseUp);
picBox.BackColor = Color.FromArgb(rad.Next(0, 255), rad.Next(0, 255), rad.Next(0, 255));
picBox.BorderStyle = BorderStyle.Fixed3D;
picBox.Location = new Point(0, 0);
panel1.Controls.Add(picBox);
picBox.Width = rad.Next(panel1.Width / 7, panel1.Width/3);
picBox.Height = rad.Next(panel1.Height / 5, panel1.Height/3);
areas += picBox.Width * picBox.Height;

lst.Add(picBox);
}

lst.Sort(delegate(PictureBox pic1, PictureBox pic2) {
int a1 = pic1.Width * pic1.Height;
int a2 = pic2.Width * pic2.Height;
return a2.CompareTo(a1);
});

DoSpellBoard();
this.Text = areas.ToString() + "/" + (this.panel1.Width*this.panel1.Height);
}


public void DoSpellBoard()
{

throw new Exception("请高手赐教");
}


void picBox_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
allowMove = false;
sPoint = Point.Empty;
}
}

void picBox_MouseMove(object sender, MouseEventArgs e)
{
if (allowMove && e.Button == MouseButtons.Left)
{
PictureBox picBox = sender as PictureBox;
picBox.Location = new Point(picBox.Location.X + e.X - sPoint.X, picBox.Location.Y + e.Y - sPoint.Y);
}
}

bool allowMove = false;
Point sPoint = Point.Empty;
void picBox_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
allowMove = true;
sPoint = e.Location;
}
}
}
...全文
273 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bloodish 2010-11-16
  • 打赏
  • 举报
回复
为什么你的xx率是0呢?
先去看
【转帖】我最讨厌的10种帖子!!!再来发帖
wangan2008 2010-11-16
  • 打赏
  • 举报
回复
可以再前台把想要的样子 拼好 然后 复制到后台 整理一下。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧