在C#WinForm项目中显示移动像素的踪迹

时间:2016-06-25 08:49:35

标签: c# winforms

我正在研究一个与蚁群问题相关的个人项目。 我成功地为控制台项目开发了所有内容,现在我想用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();
    }

2 个答案:

答案 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对象已被处理。

该示例假设您已经可以正确绘制蚂蚁本身并简单地添加路径..