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
相关产品推荐
相关产品推荐

