基於C 的2D太陽 地球 月亮運動軌跡模擬實現

2021-06-05 06:58:24 字數 3884 閱讀 4064

如題所示----基於c#的2d太陽、地球、月亮運動軌跡模擬實現。

此題目屬於圖形學中比較典型的有關運動軌跡實現的問題。

首先二話不說,站在物件導向的角度考慮至少包含太陽、地球、月亮三個類。由於是模擬實現,故有些相關資料並非的絕對正確。在此我們假設太陽位於螢幕的畫布的中心,且靜止不動(雖然有自轉,但是由於是2d不好顯示,並且如此假設也不影響最終整體效果,故假設之);地球圍繞太陽公轉(假設執行軌跡為圓);月亮圍繞地球公轉。

問題難點:地球在圍繞太陽轉動的同時,月亮也在圍繞地球公轉,並且地球公轉的角速度是月亮角速度的1/12.

執行平台:windows 7

開發工具:microsoft visual studio 2010

開發語言:c# 、gdi+

程式型別:windows窗體應用程式

1)興建工程(在此我們將此工程命名為sunearthmoon)

開啟visual studio 2010 -->檔案-->興建-->專案;選擇windows窗體應用程式,在"名稱"後面上sunearthmoon, 然後選擇程式儲存的路徑,單擊確定即可。

如果你在你的「解決方案資源管理器」中看到有如下圖示檔案目錄結構,

那麼說明你的

sunearthmoon工程已經成功建立可以成功跳至2)了;否之

,你還需要返回1),直到成功為止。

(1)在模擬的時候,由於太陽,地球,月亮他們有很多相似的地方,故在此抽象出了乙個

start的父類,裡面主要包含一些公共的屬性並提供乙個待子類重寫的draw()虛函式。

**如下:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.drawing;

using system.drawing.drawing2d;

namespace sunearthmoon}}

(2)然後是sun、earth、moon類的具體實現;他們都繼承至start,都重寫了draw方法而已。

**如下:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.drawing;

using system.drawing.drawing2d;

namespace sunearthmoon

public sun(point center, point movingcenter, int radius, int movingradius ,graphics graphics,color bgcolor)

public override void draw() }}

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.drawing;

using system.drawing.drawing2d;

namespace sunearthmoon

public earth(point center, point movingcenter, int radius, int movingradius, graphics graphics, color bgcolor)

public override void draw() }}

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.drawing;

using system.drawing.drawing2d;

namespace sunearthmoon

public moon(point center, point movingcenter, int radius, int movingradius, graphics graphics, color bgcolor)

public override void draw() }}

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.drawing;

using system.drawing.drawing2d;

using system.threading;

namespace sunearthmoon

public void draw(bool ismoving)

public void drawbg()

private void threaddraw()

}public bool ismoving

set

}public double d_angle

set } }

}

左鍵雙擊 解決方案中的「form1.cs」;利用vs2010自帶的工具箱,在form1的設計介面上(form1.cs[設計]),設計出如下介面;並通過修改控制項屬性,達到如圖效果:

左鍵雙擊form1介面中的任意乙個控制項,即可跳到form1.cs介面,在這裡我們將新增所有控制項的響應事件。      

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.windows.forms;

namespace sunearthmoon

private void panel2_paint(object sender, painteventargs e)

private void button1_click(object sender, eventargs e)

private void button2_click(object sender, eventargs e)

private void button3_click(object sender, eventargs e)

else

}private void button4_click(object sender, eventargs e)

else }}

}

(2)單擊「開始演示」按鈕

(3)單擊「暫停演示」按鈕

(4)單擊「運動加速」

注:必須是在執行狀態下才單擊此按鈕才有用,如果是暫停狀態中,那麼「開始按鈕」使其處於執行狀態即可。

(5)單擊「運動減速」

注:必須是在執行狀態下才單擊此按鈕才有用,如果是暫停狀態中,那麼「開始按鈕」使其處於執行狀態即可。

(6)退出程式

此程式的退出最好是在暫停的狀態下,然後單擊右上方的」x「即可。

本專案是典型的有關圖形的移動處理的示例;在這方面自己還存在很大不足,需要加倍努力。

程式中的不足:

完全**已上傳至資源中心

請到 

在基於shader的D3D程式中實現2D面板

3d遊戲中,很多東西都需要以2d的形式展現,比如人物的狀態列,物品欄等,那麼如何才能在3d場景中放置它們呢?我在這裡介紹一種通過簡化變換過程而實現的方法.大家知道,乙個模型頂點在顯示到螢幕上,一共要經過4次變換,分別是世界變換,攝象機變換,投影變換以及視口變換.在世界變換中,我們通過乙個仿射矩陣把這...

基於2D多邊形的碰撞檢測和響應 一

簡介 本文是闡述如何在2d動作遊戲中進行精確而高效的碰撞檢測。這裡的碰撞是基於多邊形而不是基於精靈的。這兩者之間在設計上會有不同。基於精靈的碰撞檢測是通過精靈之間的重疊的畫素來完成的。而多邊形使用向量數學來精確計算交點,時間和碰撞方向。雖然多邊形僅僅是精靈的乙個近似,但是它比精靈系統要高階。特性本文...

基於2D多邊形的碰撞檢測和響應 四

下面要作的是用給定的量將兩個物體分離,並新增一點摩擦和一些靜態摩擦,以便使物體靜止在斜面上。該部分使用簡單的速度影響演算法。同樣,為了使碰撞響應更加真實,物體被賦予了質量 更好的是質量的倒數 質量的倒數是比較常用的,該值為零意味著該物體具有無窮大的質量,並因此不能移動。同時速度響應中使用質量的倒數具...