2D
圖形相關
C++界面庫:使用Graphic Element Template制作按鈕模板
摘要: 這一次制作的按鈕模板具有通過模板屬性動態配置圖形的功能。模板的屬性一共有6個:x、y、w、h、state、content,其中state有normal、hot和press三個取值。XML、代碼和截圖如下:
閱讀全文
posted @
2009-08-20 05:38 陳梓瀚(vczh) 閱讀(4242) |
評論 (7) 編輯
C++界面庫:Graphic Element Template實現
摘要: 這篇文章描述的一個圖形元素模板終于通過了冒煙測試。下面將展示模板的XML代碼、調用模板的代碼以及截圖。
閱讀全文
posted @
2009-08-19 03:29 陳梓瀚(vczh) 閱讀(3527) |
評論 (5) 編輯
C++界面庫:為Graphic Element Template做了一個XML Schema
摘要: 我們知道制作控件的時候,其實最困難的不是定出那個支撐整個系統的架構,而是為各種空間寫繪制的代碼(囧)。為了解決這個問題,我在這套渲染庫上設計了一種XML寫成的模板,然后在模板內部提供一個簡單的語言來進行簡單但是強大的運算。這樣的話,不僅可以省略很多代碼,還為控件的換膚提供了強有力的支持。
閱讀全文
posted @
2009-08-07 07:29 陳梓瀚(vczh) 閱讀(3003) |
評論 (1) 編輯
C++界面庫:在GDI上添加完全的alpha混合支持
摘要: 做完了小型WCF之后,就是小型的WPF了。之前那個完全避免用戶大部分的錯誤使用導致的死鎖的方案還有一點點的問題,所以先休息一下,做做別的。為了在C++上重現一套類似WPF的工具,首先要解決繪圖部分。
繪圖的設備當然是需要可切換的,于是用bridge模式定義了大量的接口,這些接口用來創建畫筆、畫刷、字體和圖形,然后圖形用樹的形式組織起來,最后放到一塊跟窗口鏈接的畫板上面,有需要的時候自動繪制。為了最快速地開始工作,我實現了一個GDI的繪圖設備,以后有空再做DirectX的。但是我們知道GDI對alpha的支持是很弱的,只有一個叫alphablend的API用來貼bitmap,因此為了讓畫刷和畫筆都能夠支持alpha漸變、alpha位圖和alpha顏色,做了很多的工作。
閱讀全文
posted @
2009-08-02 02:41 陳梓瀚(vczh) 閱讀(6411) |
評論 (3) 編輯
將樹型數據結構轉換為圖片并自動排版
摘要: 『啊,蔥爆羊肉真是香啊。』一邊回憶著這個令人感動的美食,一邊心不在焉地寫了個程序。這個小程序實現了一個很簡單的功能,將一棵樹轉換成bmp圖片并自動排版。
閱讀全文
posted @
2008-09-07 04:18 陳梓瀚(vczh) 閱讀(2877) |
評論 (3) 編輯
使用拓撲進行幾何圖形布爾運算
摘要: 首先吐槽一下:今天考IT項目管理,100道選擇題。前幾天考配置管理,10道大題。如今的老師都喜歡走極端……
這個方法是在考完試回宿舍的路上想到的,適用于2D與3D。主要想法是這樣的。給定兩個幾何圖形A、B,把A和B都分成『內『、『外』兩部分。A的『內』就是處于B內部的部分。于是A和B就變成了A內、A外、B內、B外。然后就有如下公式:
·A and B=A外+B外
·A sub B=A外+B內
·A or B=A內+B內
·A xor B=A外+B外+A內+B內
這種數據結構是為了滿足如下算法:一個A點在圖形內<==>過這個點的直線交圖形與點集P,其中|{Pi|Pi<=A}|和|{Pi|Pi>=A}|都是奇數。注意我們使用的是<=和>=,這樣的話兩個集合的數量的奇偶性都是一致的。這個算法無論2D、3D多邊形還是3D多面體都能適用,就算是這個圖形有孔(鑲嵌)也可以,而且跟凹凸體無關。這個算法只有一種情況是不能用的:就是自己跟自己有交叉,譬如我們習慣的5條直線構成五角星的畫法。這
閱讀全文
posted @
2008-06-16 19:20 陳梓瀚(vczh) 閱讀(4541) |
評論 (7) 編輯
接下去的事情
posted @
2008-06-12 09:40 陳梓瀚(vczh) 閱讀(775) |
評論 (2) 編輯
橢圓段掃描完成
摘要: 終于完成了相當于GDI中Arc函數的功能了。這次仍然跟API有點誤差,不多這里的誤差是GDI的問題。這里貼出截圖和代碼。觀看圖2和圖3,我們知道橢圓是對稱的,但是GDI并沒有做到這一點。我的算法也不能精確對稱,但是左右兩邊僅相差1個像素。Arc是橢圓的子集,所以Arc在這個局部(橢圓的最上方)中也應該左右對稱。圖1中我先用GDI繪制黑色Arc,然后使用我的算法繪制紅色Arc。這里的自適應步長算法跟上一篇的Bezier曲線的算法是一樣的。
閱讀全文
posted @
2008-06-12 06:02 陳梓瀚(vczh) 閱讀(2348) |
評論 (5) 編輯
自適應步長Bezier曲線掃描
摘要: 花了兩個小時把這個東西做好了。雖然不及[LIEN87 ; SHAN87 ; SHAN89]論文厲害,不過自己弄的這個寫起來倒是相當容易的。在這里貼出效果圖和代碼。效果圖中,我先使用藍色畫筆,用PolyBezier繪制曲線,然后使用紅色像素使用自己的算法繪制曲線。可以看見有一點點誤差,不過效果還是可以接受的。代碼仍然使用自己的那套庫開發,不過曲線掃描的方法不受庫的限制。這個算法保證點不會被重復繪制。
有了這個算法之后我就可以把貝塞爾曲線轉換成密度剛好的折線了。這才是最終目的。
閱讀全文
posted @
2008-06-11 21:20 陳梓瀚(vczh) 閱讀(2625) |
評論 (1) 編輯
終于提取到了TrueType字體的輪廓了
摘要: 為了讓這篇文章說的東西能夠落實,無法躲避的基本東西還是要先準備一下的。今天花了6個小時查了無數資料終于把文字的邊框弄出來了。
在此貼出代碼和效果圖,不作過多解釋。熟悉Win32API中的GDI部分的朋友們可以很容易看懂。
效果圖:
提取的輪廓:紅色和黑色為直線,藍色為四次貝塞爾曲線。其中上面是先TextOut后自己畫,下面是先自己畫后TextOut。四次貝塞爾曲線轉換成三次貝塞爾曲線之后使用PolyBezier繪制。
代碼:
代碼使用的框架是我自己寒假無聊的時候封裝API的結果,暫時有窗口、菜單、組合鍵以及菜單,附帶GDI。事件自己弄了一個跟C#差不多的可以同時Bind很多不同種類函數的東西。不過這個不是重點。需要重點閱讀的是如何使用GetGlyphOutline。
dtof將double轉換成FIXED,ftod相反。
GetPoint進行點的變換,主要是因為畫字符的時候需要偏移。
DrawCurve繪制邊框。
閱讀全文
posted @
2008-06-11 07:48 陳梓瀚(vczh) 閱讀(12227) |
評論 (12) 編輯