You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现PictureBox抛物运动的虚线轨迹绘制求助

实现PictureBox抛物运动的虚线轨迹绘制

我来给你捋捋怎么实现这个虚线轨迹,思路其实很简单——咱们只要把Ball每一步的位置都记录下来,然后在窗体的重绘事件里用虚线把这些点连起来就行,具体步骤如下:

第一步:准备存储轨迹点的集合

在你的窗体类里先声明一个集合,用来保存Ball运动过程中的每个位置点:

// 放在窗体类的成员变量位置
private List<Point> _trajectoryPoints = new List<Point>();

第二步:在Timer事件里记录位置并触发重绘

修改你现有的SimulationTimer_Tick事件,每次更新Ball位置后,把当前位置加入集合,然后告诉窗体需要重绘:

private void SimulationTimer_Tick(object sender, EventArgs e)
{
    // 你原本的位置更新代码
    Ball.Location = new Point(Ball.Location.X + x, Ball.Location.Y - y);
    
    // 把当前位置添加到轨迹集合里
    _trajectoryPoints.Add(Ball.Location);
    
    // 触发窗体重绘,这样才会调用Paint事件绘制轨迹
    this.Invalidate();
}

第三步:在窗体Paint事件里绘制虚线轨迹

给窗体添加Paint事件(可以在设计器里双击窗体的Paint事件,或者手动绑定),然后用虚线画笔把记录的点连起来:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    // 至少要有两个点才能画出线,不然没意义
    if (_trajectoryPoints.Count >= 2)
    {
        // 创建一个虚线画笔,颜色和粗细可以自己调
        using (Pen dashedPen = new Pen(Color.DarkBlue, 2))
        {
            // 设置虚线样式,这里用短划线,还可以选DashDot、DashDotDot等样式
            dashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
            // 把所有轨迹点连成线
            e.Graphics.DrawLines(dashedPen, _trajectoryPoints.ToArray());
        }
    }
}

额外小提示

如果需要重置运动轨迹(比如重新开始模拟),只要清空集合并触发重绘就行:

_trajectoryPoints.Clear();
this.Invalidate();

这样一来,Timer每触发一次,Ball移动一步,轨迹点就多一个,窗体重绘时就会用虚线把所有点连起来,完美呈现抛物运动的轨迹啦~

内容的提问来源于stack exchange,提问作者user9769106

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:56:35