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