基于C#的2D太阳、地球、月亮运动轨迹模拟实现

1.题目要求:

   如题所示----基于C#的2D太阳、地球、月亮运动轨迹模拟实现。

2.研究思路:

     此题目属于图形学中比较典型的有关运动轨迹实现的问题。
     首先二话不说,站在面向对象的角度考虑至少包含太阳、地球、月亮三个类。由于是模拟实现,故有些相关数据并非的绝对正确。在此我们假设太阳位于屏幕的画布的中心,且静止不动(虽然有自转,但是由于是2D不好显示,并且如此假设也不影响最终整体效果,故假设之);地球围绕太阳公转(假设运行轨迹为圆);月亮围绕地球公转。
      问题难点:地球在围绕太阳转动的同时,月亮也在围绕地球公转,并且地球公转的角速度是月亮角速度的1/12.

3.程序说明:

      运行平台:windows 7
      开发工具:Microsoft Visual Studio 2010
      开发语言:C# 、GDI+
      程序类型:Windows窗体应用程序

4.具体实现:

    1)兴建工程(在此我们将此工程命名为SunEarthMoon
          打开Visual Studio 2010 -->文件-->兴建-->项目;选择Windows窗体应用程序,在"名称"后面上SunEarthMoon, 然后选择程序保存的路径,单击确定即可。
  

如果你在你的“解决方案资源管理器”中看到有如下图示文件目录结构, 那么说明你的
SunEarthMoon工程已经成功创建可以成功跳至2)了;否之 ,你还需要返回1),直到成功为止。

2)业务逻辑类实现

(1)在模拟的时候,由于太阳,地球,月亮他们有很多相似的地方,故在此抽象出了一个
Start的父类,里面主要包含一些公共的属性并提供一个待子类重写的draw()虚函数。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace SunEarthMoon
{
    class  Start
    {
        public  Point center;          // 星球的球星
        public  Point movingCenter;    //星球公转轨迹的中心
        public  int radius;            //星球的半径
        publi
  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C#调用OpenCV实现对物体运动轨迹的识别,可以按照以下步骤进行实现: 1. 引入OpenCV库文件并进行初始化。 2. 读取视频或摄像头帧,将当前帧和前一帧进行差分,得到两帧之间的差异。 3. 对差异帧进行二值化处理,得到前景掩模。 4. 对前景掩模进行形态学操作,例如膨胀和腐蚀,以去除噪声和填充空洞。 5. 对前景掩模进行轮廓检测,找到运动目标的轮廓。 6. 对每个轮廓进行特征提取,例如中心点坐标、面积和外接矩形。 7. 记录每个目标的中心点坐标,并将其绘制成轨迹。 以下是一个简单的示例代码,可以帮助你更好地了解如何实现: ```csharp // 引入OpenCV库文件并进行初始化 using OpenCvSharp; using System.Drawing; namespace MotionDetector { class Program { static void Main(string[] args) { // 打开摄像头 using (var capture = new VideoCapture(0)) { // 创建窗口 Cv2.NamedWindow("Motion Detection"); // 读取前一帧 var previousFrame = new Mat(); capture.Read(previousFrame); // 循环读取视频帧 while (true) { // 读取当前帧 var currentFrame = new Mat(); capture.Read(currentFrame); // 将当前帧和前一帧进行差分,得到两帧之间的差异 var difference = new Mat(); Cv2.Absdiff(previousFrame, currentFrame, difference); // 对差异帧进行二值化处理,得到前景掩模 var threshold = new Mat(); Cv2.Threshold(difference, threshold, 50, 255, ThresholdTypes.Binary); // 对前景掩模进行形态学操作,以去除噪声和填充空洞 var kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3)); Cv2.MorphologyEx(threshold, threshold, MorphTypes.Open, kernel); // 对前景掩模进行轮廓检测,找到运动目标的轮廓 var contours = new Point[][] { }; var hierarchy = new HierarchyIndex[] { }; Cv2.FindContours(threshold, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); // 对每个轮廓进行特征提取,例如中心点坐标、面积和外接矩形 foreach (var contour in contours) { var moments = Cv2.Moments(contour); var centerX = (int)(moments.M10 / moments.M00); var centerY = (int)(moments.M01 / moments.M00); var area = (int)moments.M00; var rect = Cv2.BoundingRect(contour); // 记录每个目标的中心点坐标,并将其绘制成轨迹 Cv2.Circle(currentFrame, new Point(centerX, centerY), 2, Scalar.Red, -1); } // 显示当前帧 Cv2.ImShow("Motion Detection", currentFrame); // 等待按键或延时 if (Cv2.WaitKey(30) >= 0) { break; } // 更新前一帧 previousFrame = currentFrame.Clone(); } } } } } ``` 这是一个简单的实现,它可以检测运动目标并将其绘制成轨迹,但是它还有很多可以改进的地方,例如背景建模和光流估计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值