winform 实现太阳,地球,月球 运作规律

无图言吊(动图)

缘由

最近我太太在考公学习,给我出了两道高中地理知识的题目,把我问的一头雾水,题目是这样的

第一题

第二题

看到这两道题,当时大脑飞速运转,差点整个身体都在自转了,所以产生了个偷懒的方法,用程序代替冥想,所以就有了这个小玩意的诞生.

Linux 的创始人 Linus Torvalds 在 2000-08-25 给linux-kernel 邮件列表的一封邮件提到的:

复制代码
 能说算不上什么,有本事就把你的代码给我看看。

1. 创建基本类

首先,我们创建一些基本的类来表示天体(如太阳、地球和月球)以及它们的运动。

复制代码
 public class CelestialBody
 {
     public string Name { get; set; }
     public int Radius { get; set; } // 半径
     public Color Color { get; set; } // 颜色
     public double DistanceFromSun { get; set; } // 距离太阳的距离
     public double OrbitalPeriod { get; set; } // 轨道周期(天)
     public double RotationPeriod { get; set; } // 自转周期(天)
     public double CurrentAngle { get; set; } // 当前角度(弧度)

     public CelestialBody(string name, int radius, Color color, double distanceFromSun, double orbitalPeriod, double rotationPeriod)
     {
         Name = name;
         Radius = radius;
         Color = color;
         DistanceFromSun = distanceFromSun;
         OrbitalPeriod = orbitalPeriod;
         RotationPeriod = rotationPeriod;
         CurrentAngle = 0;
     }

     public void UpdatePosition(double timeStep)
     {
         // 计算角速度(弧度/天)
         double angularVelocity = 2 * Math.PI / OrbitalPeriod;

         // 更新当前角度
         CurrentAngle += angularVelocity * timeStep;

         // 确保角度在0到2π之间
         CurrentAngle %= 2 * Math.PI;
     }

     public (double X, double Y) GetPosition()
     {
         // 计算当前天体的位置
         double x = DistanceFromSun * Math.Cos(CurrentAngle);
         double y = DistanceFromSun * Math.Sin(CurrentAngle);
         return (x, y);
     }
 }

2. 创建太阳、地球和月球

接下来,我们创建太阳、地球和月球的实例,并设置它们的属性。

复制代码
  // 初始化天体
  sun = new CelestialBody("Sun", 50, Color.Yellow, 0, 0, 0); // 太阳静止不动
  earth = new CelestialBody("Earth", 10, Color.Blue, 150, 365.25, 1); // 地球
  moon = new CelestialBody("Moon", 5, Color.Gray, 30, 27.32, 27.32); // 月球

并且初始化一个定时器,用于刷新三个球体的运行状态

复制代码
  private void Timer_Tick(object sender, EventArgs e)
  {
      // 更新天体的位置
      earth.UpdatePosition(0.1); // 时间步长为0.1天
      moon.UpdatePosition(0.1);

      // 重绘窗体
      this.Invalidate();
  }  

开始绘制太阳,地球和月亮

复制代码
  // 获取绘图对象
  graphics = e.Graphics;
  graphics.Clear(Color.Black);

  // 绘制太阳
  DrawCelestialBody(sun, 400, 400);

  // 绘制地球
  var earthPosition = earth.GetPosition();
  DrawCelestialBody(earth, 400 + (int)earthPosition.X, 400 + (int)earthPosition.Y);

  // 绘制月球
  var moonPosition = moon.GetPosition();
  DrawCelestialBody(moon, 400 + (int)earthPosition.X + (int)moonPosition.X, 400 + (int)earthPosition.Y + (int)moonPosition.Y);

3. 运行模拟

运行上述代码,你将看到地球和月球在100天内的位置变化。这个模拟是一个非常简化的模型,假设地球和月球的轨道是完美的圆形,并且忽略了其他天体的引力影响。

看上去有点丑,我们添加写素材,去掉已知的轨迹边框,并且找些素材美化他们

并且标识出赤道和经线,以及南北半球

复制代码
  // 绘制南北半球标识 
  graphics.DrawLine(Pens.Red, x - radius, y, x + radius, y); // 赤道
  graphics.DrawLine(Pens.Yellow, x, y - radius, x, y + radius); // 经线 

  // 绘制北极和南极
  graphics.FillEllipse(Brushes.White, x - 3, y - radius - 3, 6, 6); // 北极
  graphics.FillEllipse(Brushes.Green, x - 3, y + radius - 3, 6, 6); // 南极

如上我们绘制一条红线标识赤道,黄线标识经线,白色圆点表示北极,绿色圆点表示南极,这样方便我们根据不同象限,在脑海里面构思具体经纬度

4. 最终效果

图片素材 https://polyhaven.com/textures

4. 解题思路

四季变化的总结

  • 根本原因:地球自转轴的倾斜(约 23.5 度)。

  • 直接原因:地球在公转过程中,太阳直射点在南北回归线之间移动。

  • 结果:不同时间段,地球表面接收到的太阳辐射量不同,从而导致温度变化和四季交替。

四季变化的原理

由于地球自转轴的倾斜,地球在公转过程中,不同时间段的太阳直射点会发生变化,从而导致四季变化。具体过程如下:

(1)春分和秋分

  • 当地球公转到春分(约 3 月 21 日)和秋分(约 9 月 23 日)时,太阳直射点位于赤道

  • 此时,全球昼夜几乎等长。

  • 北半球和南半球的季节相反(例如,北半球是春季,南半球是秋季)。

(2)夏至

  • 当地球公转到夏至(约 6 月 21 日)时,太阳直射点位于北回归线(北纬 23.5 度)。

  • 此时,北半球白天最长,夜晚最短,进入夏季;南半球则相反,进入冬季。

(3)冬至

  • 当地球公转到冬至(约 12 月 22 日)时,太阳直射点位于南回归线(南纬 23.5 度)。

  • 此时,北半球白天最短,夜晚最长,进入冬季;南半球则相反,进入夏季。

有了如图展示发现:

第一题,在四大卫星发射中心中,不仅仅文昌卫星发射中心位于低纬度,其他选项ABC都正确,D错误。

第二题,A,D两项都是错误的!:春分(3.21前后),秋分(9.23前后)太阳直射在赤道上,惊蛰(3.5)在春分之前,因此这一天太阳直射点仍在南半球,切太阳直射点在向北移动。BC两项:惊蛰(3.5)在春分前,此时太阳直射点仍在南半球,南半球昼长夜短,北半球昼短夜长,且北极圈内部分地区存在极夜现象,B错误,所以选C

5. 结束语

最后,预祝各位考公学子,榜上有名!成功上岸!

感谢各位耐心查阅! 由于系统引用文件较多,压缩后源码文件仍然很大,如果有需要源码的朋友,可以微信公众号联系博主,源码可以免费赠予~!如果觉得本篇博文对您或者身边朋友有帮助的,麻烦点个关注!赠人玫瑰,手留余香,您的支持就是我写作最大的动力,感谢您的关注,期待和您一起探讨!再会!

相关推荐
程序设计实验室5 小时前
一次小而美的重构:使用 C# 在 Avalonia 中生成真正好看的词云
c#
电商api接口开发6 小时前
ASP.NET MVC 入门指南二
前端·c#·html·mvc
o0向阳而生0o9 小时前
28、.NET 中元数据是什么?
microsoft·c#·.net
niuTaylor10 小时前
Linux驱动开发快速上手指南:从理论到实战
linux·运维·开发语言·驱动开发·c#
军训猫猫头10 小时前
89.WPF 中实现便捷的数字输入框:DecimalUpDown 控件的使用 WPF例子 C#例子.
开发语言·c#·wpf
冰茶_12 小时前
.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架
学习·microsoft·微软·c#·.net·xamarin
The Future is mine13 小时前
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
开发语言·c#
Iotfsd20 小时前
.NET写的开源工业物联网网关(IoTGateway)
物联网·c#·.net·dotnet·边缘网关·雾计算·工业物联网智能网关
先生沉默先20 小时前
c#接口_抽象类_多态学习
开发语言·学习·c#
江沉晚呤时20 小时前
深入了解C# List集合及两种常见排序算法:插入排序与堆排序
windows·sql·算法·oracle·c#·排序算法·mybatis