随笔-341  评论-2670  文章-0  trackbacks-0
2D
图形相关
GUI真TAMA难做啊
posted @ 2011-04-29 19:50 陈梓瀚(vczh) 阅读(5530) | 评论 (13)  编辑
C++界面库:使用Graphic Element Template制作按钮模板      摘要: 这一次制作的按钮模板具有通过模板属性动态配置图形的功能。模板的属性一共有6个:x、y、w、h、state、content,其中state有normal、hot和press三个取值。XML、代码和截图如下:  阅读全文
posted @ 2009-08-20 05:38 陈梓瀚(vczh) 阅读(4161) | 评论 (7)  编辑
C++界面库:Graphic Element Template实现      摘要: 这篇文章描述的一个图形元素模板终于通过了冒烟测试。下面将展示模板的XML代码、调用模板的代码以及截图。  阅读全文
posted @ 2009-08-19 03:29 陈梓瀚(vczh) 阅读(3486) | 评论 (5)  编辑
C++界面库:为Graphic Element Template做了一个XML Schema      摘要: 我们知道制作控件的时候,其实最困难的不是定出那个支撑整个系统的架构,而是为各种空间写绘制的代码(囧)。为了解决这个问题,我在这套渲染库上设计了一种XML写成的模板,然后在模板内部提供一个简单的语言来进行简单但是强大的运算。这样的话,不仅可以省略很多代码,还为控件的换肤提供了强有力的支持。
  阅读全文
posted @ 2009-08-07 07:29 陈梓瀚(vczh) 阅读(2966) | 评论 (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) 阅读(6339) | 评论 (3)  编辑
将树型数据结构转换为图片并自动排版      摘要: 『啊,葱爆羊肉真是香啊。』一边回忆着这个令人感动的美食,一边心不在焉地写了个程序。这个小程序实现了一个很简单的功能,将一棵树转换成bmp图片并自动排版。  阅读全文
posted @ 2008-09-07 04:18 陈梓瀚(vczh) 阅读(2819) | 评论 (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) 阅读(4396) | 评论 (7)  编辑
接下去的事情
posted @ 2008-06-12 09:40 陈梓瀚(vczh) 阅读(741) | 评论 (2)  编辑
椭圆段扫描完成      摘要: 终于完成了相当于GDI中Arc函数的功能了。这次仍然跟API有点误差,不多这里的误差是GDI的问题。这里贴出截图和代码。观看图2和图3,我们知道椭圆是对称的,但是GDI并没有做到这一点。我的算法也不能精确对称,但是左右两边仅相差1个像素。Arc是椭圆的子集,所以Arc在这个局部(椭圆的最上方)中也应该左右对称。图1中我先用GDI绘制黑色Arc,然后使用我的算法绘制红色Arc。这里的自适应步长算法跟上一篇的Bezier曲线的算法是一样的。  阅读全文
posted @ 2008-06-12 06:02 陈梓瀚(vczh) 阅读(2317) | 评论 (5)  编辑
自适应步长Bezier曲线扫描      摘要: 花了两个小时把这个东西做好了。虽然不及[LIEN87 ; SHAN87 ; SHAN89]论文厉害,不过自己弄的这个写起来倒是相当容易的。在这里贴出效果图和代码。效果图中,我先使用蓝色画笔,用PolyBezier绘制曲线,然后使用红色像素使用自己的算法绘制曲线。可以看见有一点点误差,不过效果还是可以接受的。代码仍然使用自己的那套库开发,不过曲线扫描的方法不受库的限制。这个算法保证点不会被重复绘制。

有了这个算法之后我就可以把贝塞尔曲线转换成密度刚好的折线了。这才是最终目的。  阅读全文
posted @ 2008-06-11 21:20 陈梓瀚(vczh) 阅读(2591) | 评论 (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) 阅读(11800) | 评论 (12)  编辑