winform 绘制太阳,地球,月球 运作规律

B站影视 韩国电影 2025-09-20 08:39 7

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

无图言吊(效果动图)

缘由

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

第一题:

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

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

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

Talk is cheap.Show me the code.

创建基本类

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

publicclassCelestialBody{publicstringName { get; set; }publicintRadius { get; set; } // 半径publicColor Color { get; set; } // 颜色publicdoubleDistanceFromSun { get; set; } // 距离太阳的距离publicdoubleOrbitalPeriod { get; set; } // 轨道周期(天)publicdoubleRotationPeriod { get; set; } // 自转周期(天)publicdoubleCurrentAngle { get; set; } // 当前角度(弧度)publicCelestialBody(stringname, intradius, Color color, doubledistanceFromSun, doubleorbitalPeriod, doublerotationPeriod){Name = name;Radius = radius;Color = color;DistanceFromSun = distanceFromSun;OrbitalPeriod = orbitalPeriod;RotationPeriod = rotationPeriod;CurrentAngle = 0;}publicvoidUpdatePosition(doubletimeStep){// 计算角速度(弧度/天)doubleangularVelocity = 2 * Math.PI / OrbitalPeriod;// 更新当前角度CurrentAngle += angularVelocity * timeStep;// 确保角度在0到2π之间CurrentAngle %= 2 * Math.PI;}public(doubleX, doubleY) GetPosition{// 计算当前天体的位置doublex = DistanceFromSun * Math.Cos(CurrentAngle);doubley = DistanceFromSun * Math.Sin(CurrentAngle);return(x, y);}}创建太阳,地球,月球

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

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

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

// 获取绘图对象graphics = e.Graphics;graphics.Clear(Color.Black);// 绘制太阳DrawCelestialBody(sun, 400, 400);// 绘制地球varearthPosition = earth.GetPosition;DrawCelestialBody(earth, 400 + (int)earthPosition.X, 400 + (int)earthPosition.Y);// 绘制月球varmoonPosition = moon.GetPosition;DrawCelestialBody(moon, 400 + (int)earthPosition.X + (int)moonPosition.X, 400 + (int)earthPosition.Y + (int)moonPosition.Y);

模拟运行

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

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

有需要可以标识出赤道和经线,以及南北半球

// 绘制南北半球标识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); // 南极

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

加上地球自转的特效

// 创建一个旋转矩阵Matrix transform = newMatrix;transform.RotateAt((float)(body.CurrentRotationAngle * 180 / Math.PI), newPointF(x, y));// 应用旋转矩阵graphics.Transform = transform;// 绘制天体纹理if(body.Name == "Earth"){graphics.DrawImage(earthTexture, x - body.Radius, y - body.Radius, body.Radius * 2, body.Radius * 2);}else{graphics.FillEllipse(newSolidBrush(body.Color), x - body.Radius, y - body.Radius, body.Radius * 2, body.Radius * 2);}// 重置变换graphics.ResetTransform;

最终效果

解题思路

四季变化的原理

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

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

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

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

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

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

(3)冬至

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

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

有了如图展示发现:

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

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

结束语

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

来源:opendotnet

相关推荐