原文地址:https://billc.io/2019/10/fpainter/git
計算機圖形學的第一個大做業是用 OpenGL 或 DirectX3d 實現一個平面的畫圖,應當具有直線和圓形的功能。正好國慶放假時間比較充裕,就稍微完善了一下界面,實現了一個畫圖。github
爲了使 OpenGL 能正確地與 C# 互動,能夠採用動態連接的方式直接手動將 OpenGl 的 dll 連接進本身工程中,但這種方法比較繁瑣,何況網上已經有許多人作了重複的工做,因而我選擇了一個彷佛並非特別受歡迎的包裝庫 SharpGL 來在 C# 中使用 OpenGL 的函數。框架
若是採用 OpenGLControl 控件獲取 OpenGL 對象,那麼使用 SharpGL 的代碼風格會是這樣:函數
//C# SharpeGL.OpenGL gl = glCanvas.OpenGL; gl.Color(0, 0, 0); gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); gl.LoadIdentity(); gl.Translate(-4.68f, 4.11f, -10f);
相比對應的 OpenGL 在 C/C++ 中的代碼,能夠流暢地轉換。同時這個庫還省去了 Glut 函數後面的 3f 等惱人的參數,所有重載了一塊兒。post
//C glColor3f(0, 0, 0); glClear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(-4.68f, 4.11f, -10f);
你能夠在這裏 https://github.com/dwmkerr/sharpgl 瞭解到關於 SharpGL 的更多信息。設計
主要的功能如圖。基本的畫圖功能均可以實現,刷新率大概在每秒30幀的樣子。須要運行在 .Net Framework 4.6以上,由於須要一個高 dpi 感知的 manifest。3d
目前還有兩個須要探索的問題,一個是在拖動繪製直線的時候可以實時顯示當前的繪製效果而不是擡起鼠標以後才繪製。也許要設計一些 buffer 相關的知識但目前本身的能力彷佛還作不到。對象
同時使用以下代碼開啓抗鋸齒後,圓形的繪製會有較大問題。在每一次繪製的時候多邊形都會填充一次,形成繪製出來的圓形會成爲這個樣子:ci
//抗鋸齒 gl.Enable(OpenGL.GL_BLEND); gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA); gl.Enable(OpenGL.GL_POINT_SMOOTH); gl.Enable(OpenGL.GL_LINE_SMOOTH); gl.Enable(OpenGL.GL_POLYGON_SMOOTH);
//圓形的繪製代碼 case Tools.circle: //使用參數函數 x = Acos; y = Bsin畫橢圓 double lenA = Math.Abs(fx - pointQueue.Peek().fx) / 2.0; double lenB = Math.Abs(fy - pointQueue.Peek().fy) / 2.0; fPoint center = new fPoint((fx + pointQueue.Peek().fx) / 2.0, (fy + pointQueue.Peek().fy) / 2.0); int n = 90; //精度,以n邊的多邊形代替橢圓 gl.Begin(OpenGL.GL_POLYGON); { for (double alpha = 0; alpha < Math.PI * 2; alpha += Math.PI / n) { gl.Vertex(center.fx + Math.Cos(alpha) * lenA, center.fy + Math.Sin(alpha) * lenB, 0f); } } gl.End(); pointQueue.Clear(); break;
你能夠在這裏找到源代碼: https://github.com/BillChen2000/LearningRepo/tree/master/Course/ComputerGraphics/FPainter文檔
以前原本的要求是用 MFC 實現圖形界面,但看了看上世紀的框架文檔實在是沒有心思繼續鑽研下去。不知道何時大學的老師們可以在 ppt 裏稍微去掉一些 199x 年的古董。