如何在移动线后绘制轨迹/轨迹?

时间:2014-01-15 21:56:03

标签: c# winforms

我的代码是绘制一个圆,然后是从圆的中间到圆的半径大小的线,并且线移动了1个角。

现在我想让这条线在雷达效应之后留下一些痕迹/痕迹。

private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            anglecounter += 1;
            double x = pictureBox1.Size.Width / 2 + 256 *Math.Cos(anglecounter * Math.PI / 180);
            double y = pictureBox1.Size.Height / 2 +256 * Math.Sin(anglecounter * Math.PI / 180);
            CloudEnteringAlert.Paint(e.Graphics, factor, distance);
            e.Graphics.DrawLine(
            new Pen(Color.Red, 2f),
            new Point(pictureBox1.Size.Width / 2, pictureBox1.Size.Height/2),
            new Point((int)x, (int)y));

            e.Graphics.DrawEllipse(
                new Pen(Color.Red, 2f),
                0, 0, pictureBox1.Size.Width, pictureBox1.Size.Height);
        }

我该怎么做?

编辑**

这就是我现在在我添加的表格顶部所做的:

PointF _pt = new PointF(0F, 0F);
PointF _pt2 = new PointF(1F, 1F);
PointF _pt3 = new PointF(2F, 2F);
Color _lineColor = Color.FromArgb(0, 255, 0);
private double anglecounter1;

然后paint事件现在看起来像这样:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {

            anglecounter += 1;
            anglecounter1 += 0.5;
            double x = pictureBox1.Size.Width / 2 + 256 *Math.Cos(anglecounter * Math.PI / 180);
            double y = pictureBox1.Size.Height / 2 +256 * Math.Sin(anglecounter * Math.PI / 180);
            double x1 = pictureBox1.Size.Width / 2 + 256 * Math.Cos(anglecounter1 * Math.PI / 180);
            double y1 = pictureBox1.Size.Height / 2 + 256 * Math.Sin(anglecounter1 * Math.PI / 180);
            CloudEnteringAlert.Paint(e.Graphics, factor, distance);
            e.Graphics.DrawLine(
            new Pen(Color.Red, 2f),
            new Point(pictureBox1.Size.Width / 2, pictureBox1.Size.Height/2),
            new Point((int)x, (int)y));

            e.Graphics.DrawEllipse(
                new Pen(Color.Red, 2f),
                0, 0, pictureBox1.Size.Width, pictureBox1.Size.Height);

            // create the fade path and gradient
            GraphicsPath gp = new GraphicsPath(FillMode.Winding);
            gp.AddLine(new PointF((float)(pictureBox1.Size.Width / 2), (float)(pictureBox1.Size.Height / 2)),new PointF( (float)x1,(float)y1));
            gp.AddCurve(new PointF[] { _pt2, _pt3, _pt });
            gp.AddLine(new PointF((float)x, (float)y), new PointF((float)(pictureBox1.Size.Width / 2), (float)(pictureBox1.Size.Height / 2)));
            PathGradientBrush pgb = new PathGradientBrush(gp);
            pgb.CenterPoint = new PointF((float)x1, (float)y1);
            pgb.CenterColor = Color.FromArgb(128, _lineColor);
            pgb.SurroundColors = new Color[] { Color.Empty };
            // draw the fade path
            e.Graphics.FillPath(pgb, gp);
        }

但是,如果在这种情况下我没有错,那么路径/跟踪速度会慢一些,然后线路会越来越快。轨迹/轨迹也在线后面,但也在线的前面。我不确定,但那就是我看到的。那有什么不对?

1 个答案:

答案 0 :(得分:0)

另一种选择是不要每次都擦除图像。相反,在上一张图像上绘制一个半透明的圆圈:

// Initialize some dimensions
int x = pictureBox1.Bounds.X;
int y = pictureBox1.Bounds.Y;
int w = Math.Min(pictureBox1.Bounds.Width, pictureBox1.Bounds.Height);
int h = w;    // Force square
int centerX = w / 2;
int centerY = h / 2;
float radius = w - centerX;
Graphics g = pictureBox1.CreateGraphics();
// First time draw a solid background then
// each successive time cover with semi-transparent background
Brush backGround = firstTime ? new SolidBrush(Color.FromArgb(255, 0, 0, 0)) : new SolidBrush(Color.FromArgb(10, 0, 0, 0));
firstTime = false;
g.FillEllipse(backGround, 0, 0, w, h);
float lineX = (float)(centerX + (radius * Math.Sin(anglecounter * (Math.PI / 180))));
float lineY = (float)(centerX + (radius * Math.Cos(anglecounter * (Math.PI / 180))));
anglecounter -= 1;
g.DrawLine(new Pen(Color.Green, 3), centerX, centerY, lineX, lineY);
g.DrawArc(new Pen(Color.Red, 4), new Rectangle(0, 0, w - 1, h - 1), 0, 360);

产生这个结果: enter image description here