我正在研究一个与蚁群问题相关的个人项目。 我成功地为控制台项目开发了所有内容,现在我想用Windows窗体更加图形化地转换代码。
使用下面的代码可以正确显示一个移动像素,但我无法找到显示移动左侧轨迹的方法。我试图删除pictureBox1.Invalidate(),但这会让我在起点上看到一个静态像素。
我不想重新制作地图矩阵并绘制信息素轨迹,但只留下绘制的位置,好像我正在用纸笔在一张纸上画画。
public void RenderAnts(object sender, PaintEventArgs e)
{
pictureBox1.Invalidate();
foreach (Ant a in ants)
{
Brush c;
c = Brushes.DarkBlue;
if (a.role == AntRole.Scout)
{
a.Move(i);
c = Brushes.Red;
}
e.Graphics.FillRectangle(c, a.position.x, a.position.y, 1, 1);
}
pictureBox1.Show();
}
答案 0 :(得分:0)
添加<section>
<input type="checkbox" id="control" />
<label for="control">Toggle</label>
<div id="transition-div"></div>
</section>
表单字段,其中List<Point>
是ant Point
字段的类型。在每个Position
上添加当前蚂蚁位置到此列表。我通过鼠标点击Move
来模拟移动。 Paint事件处理程序只是绘制位置。
参见样本
PictureBox
运行并尝试单击鼠标。
答案 1 :(得分:0)
这是一个解决方案,它将线索绘制成位图,将新蚂蚁绘制到表面上:
准备位图:
Bitmap bmp = new Bitmap(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
pictureBox1.Image = bmp;
现在修改了paint事件:
void RenderAnts(object sender, PaintEventArgs e)
{
//pictureBox1.Invalidate(); // don't do this here!
using (Graphics G = Graphics.FromImage(pictureBox1.Image))
foreach (ant a in ants)
{
c = Brushes.DarkBlue;
if (a.role == AntRole.Scout)
{
a.Move(i);
c = Brushes.Red;
}
// this draws onto the surface:
e.Graphics.FillRectangle(c, a.position.x, a.position.y, 1, 1);
// and this into the Image bitmap below:
G.FillRectangle(Brushes.Gray, a.position.x, a.position.y, 1, 1);
}
}
请注意,表面位于上方图像。
我不确定您的代码的详细信息;特别是变量i
不清楚..你确实可能想考虑浮动的位置..
不要从pictureBox1.Invalidate()
事件中调用Paint
,因为这通常会再次触发Paint
事件。相反,这可能会转移到动画计时器刻度或按钮点击等。
另请注意using
子句,以确保我创建的Graphics
对象已被处理。
该示例假设您已经可以正确绘制蚂蚁本身并简单地添加路径..